From 58e69aae9c126695ff9e598bd89adb0c74a713b5 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Thu, 12 Nov 2020 08:48:41 +1100 Subject: [PATCH] Organize files --- .../Components/ConversationCell.swift | 0 .../Components/ConversationTitleView.swift | 0 .../Loki => }/Components/FakeChatView.swift | 0 .../MentionCandidateSelectionView.swift | 0 .../Components/NewConversationButtonSet.swift | 0 .../Loki => }/Components/PNOptionView.swift | 0 .../Loki => }/Components/PathStatusView.swift | 0 .../Components/SeedReminderView.swift | 0 .../Components/SessionRestorationView.swift | 0 .../{src/Loki => }/Components/UserCell.swift | 0 .../Components/VoiceMessageView.swift | 0 .../Database/Storage+VolumeSamples.swift | 0 .../Dependencies/SRCopyableLabel.swift | 0 .../Loki => }/Dependencies/SwiftCSV/CSV.swift | 0 .../Dependencies/SwiftCSV/Description.swift | 0 .../SwiftCSV/EnumeratedView.swift | 0 .../Dependencies/SwiftCSV/NamedView.swift | 0 .../Dependencies/SwiftCSV/Parser.swift | 0 .../Dependencies/SwiftCSV/ParsingState.swift | 0 .../Dependencies/SwiftCSV/String+Lines.swift | 0 Session/{ => Meta}/AudioFiles/NewMessage.aifc | Bin .../{ => Meta}/AudioFiles/busy_tone_ansi.caf | Bin .../AudioFiles/end_call_tone_cept.caf | Bin .../messageReceivedSounds/aurora-quiet.aifc | Bin .../messageReceivedSounds/aurora.aifc | Bin .../messageReceivedSounds/bamboo-quiet.aifc | Bin .../messageReceivedSounds/bamboo.aifc | Bin .../messageReceivedSounds/chord-quiet.aifc | Bin .../messageReceivedSounds/chord.aifc | Bin .../messageReceivedSounds/circles-quiet.aifc | Bin .../messageReceivedSounds/circles.aifc | Bin .../messageReceivedSounds/classic-quiet.aifc | Bin .../messageReceivedSounds/classic.aifc | Bin .../messageReceivedSounds/complete-quiet.aifc | Bin .../messageReceivedSounds/complete.aifc | Bin .../messageReceivedSounds/hello-quiet.aifc | Bin .../messageReceivedSounds/hello.aifc | Bin .../messageReceivedSounds/input-quiet.aifc | Bin .../messageReceivedSounds/input.aifc | Bin .../messageReceivedSounds/keys-quiet.aifc | Bin .../messageReceivedSounds/keys.aifc | Bin .../messageReceivedSounds/make-quiet.sh | 0 .../messageReceivedSounds/note-quiet.aifc | Bin .../messageReceivedSounds/note.aifc | Bin .../messageReceivedSounds/popcorn-quiet.aifc | Bin .../messageReceivedSounds/popcorn.aifc | Bin .../messageReceivedSounds/pulse-quiet.aifc | Bin .../messageReceivedSounds/pulse.aifc | Bin .../messageReceivedSounds/synth-quiet.aifc | Bin .../messageReceivedSounds/synth.aifc | Bin .../{ => Meta}/AudioFiles/message_sent.aiff | Bin .../AudioFiles/ringback_tone_ansi.caf | Bin .../AudioFiles/ringtoneSounds/Opening.m4r | Bin Session/{ => Meta}/AudioFiles/sonarping.mp3 | Bin .../CSV/GeoLite2-Country-Blocks-IPv4.csv | 0 .../GeoLite2-Country-Locations-English.csv | 0 Session/{ => Meta}/Fonts/ElegantIcons.ttf | Bin Session/{ => Meta/Fonts}/SpaceMono-Bold.ttf | Bin .../Loki => Meta/Fonts}/SpaceMono-Regular.ttf | Bin Session/{ => Meta}/Fonts/dripicons-v2.ttf | Bin .../{ => Meta}/Fonts/fontawesome-webfont.ttf | Bin .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/Icon-1024.png | Bin .../AppIcon.appiconset/Icon-120.png | Bin .../AppIcon.appiconset/Icon-121.png | Bin .../AppIcon.appiconset/Icon-152.png | Bin .../AppIcon.appiconset/Icon-167.png | Bin .../AppIcon.appiconset/Icon-180.png | Bin .../AppIcon.appiconset/Icon-20.png | Bin .../AppIcon.appiconset/Icon-29.png | Bin .../AppIcon.appiconset/Icon-30.png | Bin .../AppIcon.appiconset/Icon-40.png | Bin .../AppIcon.appiconset/Icon-41.png | Bin .../AppIcon.appiconset/Icon-42.png | Bin .../AppIcon.appiconset/Icon-58.png | Bin .../AppIcon.appiconset/Icon-59.png | Bin .../AppIcon.appiconset/Icon-60.png | Bin .../AppIcon.appiconset/Icon-76.png | Bin .../AppIcon.appiconset/Icon-80.png | Bin .../AppIcon.appiconset/Icon-81.png | Bin .../AppIcon.appiconset/Icon-87.png | Bin .../{ => Meta}/Images.xcassets/Contents.json | 0 .../Loki V2/AddPerson.imageset/AddPerson.pdf | Bin .../Loki V2/AddPerson.imageset/Contents.json | 0 .../ArrowUpDarkMode.imageset/ArrowUp.pdf | Bin .../ArrowUpDarkMode.imageset/Contents.json | 0 .../ArrowUpLightMode.pdf | Bin .../ArrowUpLightMode.imageset/Contents.json | 0 .../ChatBubbles.imageset/ChatBubbles.pdf | Bin .../ChatBubbles.imageset/Contents.json | 0 .../Loki V2/Check.imageset/Check.pdf | Bin .../Loki V2/Check.imageset/Contents.json | 0 .../Loki V2/Circle.imageset/Circle.pdf | Bin .../Loki V2/Circle.imageset/Contents.json | 0 .../CircleCheck.imageset/CircleCheck.pdf | Bin .../CircleCheck.imageset/Contents.json | 0 .../CircleDotDotDot.pdf | Bin .../CircleDotDotDot.imageset/Contents.json | 0 .../CirclePause.imageset/CirclePause.pdf | Bin .../CirclePause.imageset/Contents.json | 0 .../CirclePlay.imageset/CirclePlay.pdf | Bin .../Loki V2/CirclePlay.imageset/Contents.json | 0 .../CirclePlus.imageset/CirclePlus.pdf | Bin .../Loki V2/CirclePlus.imageset/Contents.json | 0 .../Images.xcassets/Loki V2/Contents.json | 0 .../Contents.json | 0 .../FilledCircleCheckDarkMode.pdf | Bin .../Contents.json | 0 .../FilledCircleCheckLightMode.pdf | Bin .../Loki V2/Flag.imageset/Contents.json | 0 .../Loki V2/Flag.imageset/Flag.pdf | Bin .../Loki V2/Gear.imageset/Contents.json | 0 .../Loki V2/Gear.imageset/Gear.pdf | Bin .../Loki V2/Globe.imageset/Contents.json | 0 .../Loki V2/Globe.imageset/Globe.pdf | Bin .../Loki V2/Group.imageset/Contents.json | 0 .../Loki V2/Group.imageset/Group.pdf | Bin .../Loki V2/Key.imageset/Contents.json | 0 .../Loki V2/Key.imageset/Key.pdf | Bin .../MagnifyingGlass.imageset/Contents.json | 0 .../MagnifyingGlass.pdf | Bin .../Loki V2/Message.imageset/Contents.json | 0 .../Loki V2/Message.imageset/Message.pdf | Bin .../Loki V2/Microphone.imageset/Contents.json | 0 .../Microphone.imageset/Microphone.pdf | Bin .../Loki V2/Mute.imageset/Contents.json | 0 .../Loki V2/Mute.imageset/Mute.pdf | 0 .../Loki V2/Pause.imageset/Contents.json | 0 .../Loki V2/Pause.imageset/Pause.pdf | 0 .../Loki V2/People.imageset/Contents.json | 0 .../Loki V2/People.imageset/People.pdf | Bin .../Loki V2/Play.imageset/Contents.json | 0 .../Loki V2/Play.imageset/Play.pdf | 0 .../Loki V2/Plus.imageset/Contents.json | 0 .../Loki V2/Plus.imageset/Plus.pdf | Bin .../Loki V2/QRCode.imageset/Contents.json | 0 .../Loki V2/QRCode.imageset/QRCodeFilled.pdf | Bin .../QuestionMark.imageset/Contents.json | 0 .../QuestionMark.imageset/QuestionMark.pdf | Bin .../SessionGreen32.imageset/Contents.json | 0 .../SessionGreen32.png | Bin .../SessionGreen32@2x.png | Bin .../SessionGreen32@3x.png | Bin .../SessionGreen64.imageset/Contents.json | 0 .../SessionGreen64.png | Bin .../SessionGreen64@2x.png | Bin .../SessionGreen64@3x.png | Bin .../SessionWhite16.imageset/Contents.json | 0 .../SessionWhite16.png | Bin .../SessionWhite16@2x.png | Bin .../SessionWhite16@3x.png | Bin .../SessionWhite24.imageset/Contents.json | 0 .../SessionWhite24.png | Bin .../SessionWhite24@2x.png | Bin .../SessionWhite24@3x.png | Bin .../SessionWhite40.imageset/Contents.json | 0 .../SessionWhite40.png | Bin .../SessionWhite40@2x.png | Bin .../SessionWhite40@3x.png | Bin .../Loki V2/Star.imageset/Contents.json | 0 .../Loki V2/Star.imageset/StarOutline.pdf | Bin .../Loki V2/Sun.imageset/Contents.json | 0 .../Loki V2/Sun.imageset/Sun.pdf | Bin .../Loki V2/X.imageset/Contents.json | 0 .../Images.xcassets/Loki V2/X.imageset/X.pdf | Bin .../Loki/Cog.imageset/Contents.json | 0 .../Images.xcassets/Loki/Cog.imageset/pow.png | Bin .../Loki/Cog.imageset/pow@2x.png | Bin .../Loki/Cog.imageset/pow@3x.png | Bin .../Images.xcassets/Loki/Contents.json | 0 .../Loki/Crown.imageset/Contents.json | 0 .../Loki/Crown.imageset/crown.pdf | Bin .../Loki/Loki.imageset/Contents.json | 0 .../Loki.imageset/Loki_Logo_Icon_White.pdf | 0 .../NavBarBack.imageset/Contents.json | 0 .../NavBarBackWhite@1x.png | Bin .../NavBarBackWhite@2x.png | Bin .../NavBarBackWhite@3x.png | Bin .../NavBarBackRTL.imageset/Contents.json | 0 .../NavBarBackWhiteRTL@1x.png | Bin .../NavBarBackWhiteRTL@2x.png | Bin .../NavBarBackWhiteRTL@3x.png | Bin .../Contents.json | 0 .../chevron-left-shadow-24@1x.png | Bin .../chevron-left-shadow-24@2x.png | Bin .../chevron-left-shadow-24@3x.png | Bin .../Contents.json | 0 .../chevron-right-shadow-24@1x.png | Bin .../chevron-right-shadow-24@2x.png | Bin .../chevron-right-shadow-24@3x.png | Bin .../_arrow_button.imageset/Contents.json | 0 .../_arrow_button.imageset/btnBack--white.pdf | Bin .../Contents.json | 0 .../actionsheet_camera_black@1x.png | Bin .../actionsheet_camera_black@2x.png | Bin .../actionsheet_camera_black@3x.png | Bin .../Contents.json | 0 .../actionsheet_camera_roll_black@1x.png | Bin .../actionsheet_camera_roll_black@2x.png | Bin .../actionsheet_camera_roll_black@3x.png | Bin .../Contents.json | 0 .../person_outline_24@1x.png | Bin .../person_outline_24@2x.png | Bin .../person_outline_24@3x.png | Bin .../Contents.json | 0 .../actionsheet_document_black@1x.png | Bin .../actionsheet_document_black@2x.png | Bin .../actionsheet_document_black@3x.png | Bin .../Contents.json | 0 .../actionsheet_gif_black@1x.png | Bin .../actionsheet_gif_black@2x.png | Bin .../actionsheet_gif_black@3x.png | Bin .../add-conversation.imageset/Contents.json | 0 .../add_conversation.pdf | 0 .../album_add_more.imageset/Contents.json | 0 .../create-album-outline-32@1x.png | Bin .../create-album-outline-32@2x.png | Bin .../create-album-outline-32@3x.png | Bin .../attachment_audio.imageset/Contents.json | 0 .../attachment_audio@1x.png | Bin .../attachment_audio@2x.png | Bin .../attachment_audio@3x.png | Bin .../attachment_file.imageset/Contents.json | 0 .../attachment_file@1x.png | Bin .../attachment_file@2x.png | Bin .../attachment_file@3x.png | Bin .../Contents.json | 0 .../attachment_play_button@1x.png | Bin .../attachment_play_button@2x.png | Bin .../attachment_play_button@3x.png | Bin .../Contents.json | 0 .../ic_mute_active.png | Bin .../Contents.json | 0 .../ic_mute_inactive.png | Bin .../Contents.json | 0 .../ic_speaker_active.png | Bin .../Contents.json | 0 .../ic_speaker_inactive.png | Bin .../Contents.json | 0 .../ic_video_active.png | Bin .../Contents.json | 0 .../ic_video_inactive.png | Bin .../Contents.json | 0 .../pause-48@1x.png | Bin .../pause-48@2x.png | Bin .../pause-48@3x.png | Bin .../Contents.json | 0 .../audio_pause_black_large@1x.png | Bin .../audio_pause_black_large@2x.png | Bin .../audio_pause_black_large@3x.png | Bin .../Contents.json | 0 .../play-48@1x.png | Bin .../play-48@2x.png | Bin .../play-48@3x.png | Bin .../Contents.json | 0 .../audio_play_black_large@1x.png | Bin .../audio_play_black_large@2x.png | Bin .../audio_play_black_large@3x.png | Bin .../banner_close.imageset/Contents.json | 0 .../banner_close.imageset/banner_close@1x.png | Bin .../banner_close.imageset/banner_close@2x.png | Bin .../banner_close.imageset/banner_close@3x.png | Bin .../btnCancel--blue.imageset/Contents.json | 0 .../btnCancel--blue.pdf | Bin .../btnCancel--white.imageset/Contents.json | 0 .../btnCancel--white.imageset/cancel.pdf | 0 .../btnGroup--white.imageset/Contents.json | 0 .../btnGroup--white.imageset/add_group.pdf | 0 .../btnQRShow--white-1.imageset/Contents.json | 0 .../btnQRShow--white.pdf | Bin .../btnQRShow--white.imageset/Contents.json | 0 .../btnQRShow--white.pdf | Bin .../btnRefresh--white.imageset/Contents.json | 0 .../btnRefresh--white.pdf | Bin .../button_phone_white.imageset/Contents.json | 0 .../button_phone_white@1x.png | Bin .../button_phone_white@2x.png | Bin .../button_phone_white@3x.png | Bin .../Contents.json | 0 .../button_settings_white@1x.png | Bin .../button_settings_white@2x.png | Bin .../button_settings_white@3x.png | Bin .../call-active-wide.imageset/Contents.json | 0 .../call-active-wide.png | Bin .../cancel-cross-white.imageset/Contents.json | 0 .../cancel-cross-white@1x.png | Bin .../cancel-cross-white@2x.png | Bin .../cancel-cross-white@3x.png | Bin .../cellBtnDelete.imageset/Contents.json | 0 .../cellBtnDelete.imageset/cellBtnDelete.pdf | Bin .../Contents.json | 0 .../cellBtnMoveToArchive--blue.pdf | Bin .../Contents.json | 0 .../cellBtnMoveToInbox--blue.pdf | Bin .../compose-cancel.imageset/Contents.json | 0 .../compose-cancel.imageset/x-20@1x.png | Bin .../compose-cancel.imageset/x-20@2x.png | Bin .../compose-cancel.imageset/x-20@3x.png | Bin .../Contents.json | 0 .../contact-avatar-1024.png | Bin .../contact-avatar-84.imageset/Contents.json | 0 .../contact-avatar-84.png | Bin .../Contents.json | 0 .../contact-options-action.pdf | 0 .../Contents.json | 0 .../checkbox_checked@1x.png | Bin .../checkbox_checked@2x.png | Bin .../checkbox_checked@3x.png | Bin .../Contents.json | 0 .../checkbox_unchecked@1x.png | Bin .../checkbox_unchecked@2x.png | Bin .../checkbox_unchecked@3x.png | Bin .../Contents.json | 0 .../phone_20@1x.png | Bin .../phone_20@2x.png | Bin .../phone_20@3x.png | Bin .../Contents.json | 0 .../message_20@1x.png | Bin .../message_20@2x.png | Bin .../message_20@3x.png | Bin .../Contents.json | 0 .../video_20@1x.png | Bin .../video_20@2x.png | Bin .../video_20@3x.png | Bin .../Contents.json | 0 .../search-24@1x.png | Bin .../search-24@2x.png | Bin .../search-24@3x.png | Bin .../Contents.json | 0 .../timer00_12@1x.png | Bin .../timer00_12@2x.png | Bin .../timer00_12@3x.png | Bin .../Contents.json | 0 .../timer05_12@1x.png | Bin .../timer05_12@2x.png | Bin .../timer05_12@3x.png | Bin .../Contents.json | 0 .../timer10_12@1x.png | Bin .../timer10_12@2x.png | Bin .../timer10_12@3x.png | Bin .../Contents.json | 0 .../timer15_12@1x.png | Bin .../timer15_12@2x.png | Bin .../timer15_12@3x.png | Bin .../Contents.json | 0 .../timer20_12@1x.png | Bin .../timer20_12@2x.png | Bin .../timer20_12@3x.png | Bin .../Contents.json | 0 .../timer25_12@1x.png | Bin .../timer25_12@2x.png | Bin .../timer25_12@3x.png | Bin .../Contents.json | 0 .../timer30_12@1x.png | Bin .../timer30_12@2x.png | Bin .../timer30_12@3x.png | Bin .../Contents.json | 0 .../timer35_12@1x.png | Bin .../timer35_12@2x.png | Bin .../timer35_12@3x.png | Bin .../Contents.json | 0 .../timer40_12@1x.png | Bin .../timer40_12@2x.png | Bin .../timer40_12@3x.png | Bin .../Contents.json | 0 .../timer45_12@1x.png | Bin .../timer45_12@2x.png | Bin .../timer45_12@3x.png | Bin .../Contents.json | 0 .../timer50_12@1x.png | Bin .../timer50_12@2x.png | Bin .../timer50_12@3x.png | Bin .../Contents.json | 0 .../timer55_12@1x.png | Bin .../timer55_12@2x.png | Bin .../timer55_12@3x.png | Bin .../Contents.json | 0 .../timer60_12@1x.png | Bin .../timer60_12@2x.png | Bin .../timer60_12@3x.png | Bin .../file-black-40.imageset/Contents.json | 0 .../file-black-40@1x.png | Bin .../file-black-40@2x.png | Bin .../file-black-40@3x.png | Bin .../file-icon-large.imageset/Contents.json | 0 .../file-icon-large@1x.png | Bin .../Contents.json | 0 .../file-thin-black-w-shadow-large.png | Bin .../Contents.json | 0 .../file-thin-black-large.png | Bin .../file-white-40.imageset/Contents.json | 0 .../file-white-40@1x.png | Bin .../file-white-40@2x.png | Bin .../file-white-40@3x.png | Bin .../Contents.json | 0 .../generic-attachment-small@1x.png | Bin .../generic-attachment-small@2x.png | Bin .../generic-attachment-small@3x.png | Bin .../generic-attachment.imageset/Contents.json | 0 .../file-light-large@1x.png | Bin .../file-light-large@2x.png | Bin .../file-light-large@3x.png | Bin .../giphy_logo.imageset/Contents.json | 0 .../giphy_logo.imageset/giphy_logo_2@1x.png | Bin .../giphy_logo.imageset/giphy_logo_2@2x.png | Bin .../giphy_logo.imageset/giphy_logo_2@3x.png | Bin .../group-avatar.imageset/Contents.json | 0 .../group-28-white@1x.png | Bin .../group-28-white@2x.png | Bin .../group-28-white@3x.png | Bin .../hangup-active-wide.imageset/Contents.json | 0 .../hangup-active-wide.png | Bin .../Contents.json | 0 .../human-1@3x.png | Bin .../Contents.json | 0 .../human-2@3x.png | Bin .../Contents.json | 0 .../human-3@3x.png | Bin .../Contents.json | 0 .../human-4@3x.png | Bin .../Contents.json | 0 .../human-5@3x.png | Bin .../ic_add_caption.imageset/Contents.json | 0 .../add-caption-24@1x.png | Bin .../add-caption-24@2x.png | Bin .../add-caption-24@3x.png | Bin .../ic_block.imageset/Contents.json | 0 .../ic_block.imageset/ic_block@1x.png | Bin .../ic_block.imageset/ic_block@2x.png | Bin .../ic_block.imageset/ic_block@3x.png | Bin .../ic_broken_link.imageset/Contents.json | 0 .../broken-link-16@1x.png | Bin .../broken-link-16@2x.png | Bin .../broken-link-16@3x.png | Bin .../ic_chevron_down.imageset/Contents.json | 0 .../chevron-down-24@1x.png | Bin .../chevron-down-24@2x.png | Bin .../chevron-down-24@3x.png | Bin .../ic_chevron_up.imageset/Contents.json | 0 .../chevron-up-24@1x.png | Bin .../chevron-up-24@2x.png | Bin .../chevron-up-24@3x.png | Bin .../ic_circled_plus.imageset/Contents.json | 0 .../UIRemoveControlPlus_22x22_@1x.png | Bin .../UIRemoveControlPlus_22x22_@2x.png | Bin .../UIRemoveControlPlus_22x22_@3x.png | Bin .../ic_circled_x.imageset/Contents.json | 0 .../x-circle-shadow-24@1x.png | Bin .../x-circle-shadow-24@2x.png | Bin .../x-circle-shadow-24@3x.png | Bin .../ic_color_palette.imageset/Contents.json | 0 .../color-palette-24@1x.png | Bin .../color-palette-24@2x.png | Bin .../color-palette-24@3x.png | Bin .../ic_copy.imageset/Contents.json | 0 .../ic_copy.imageset/Copy-24@1x.png | Bin .../ic_copy.imageset/Copy-24@2x.png | Bin .../ic_copy.imageset/Copy-24@3x.png | Bin .../ic_dark_theme_off.imageset/Contents.json | 0 .../dark-theme-off-24@1x.png | Bin .../dark-theme-off-24@2x.png | Bin .../dark-theme-off-24@3x.png | Bin .../ic_dark_theme_on.imageset/Contents.json | 0 .../dark-theme-on-24@1x.png | Bin .../dark-theme-on-24@2x.png | Bin .../dark-theme-on-24@3x.png | Bin .../ic_devices_ios.imageset/Contents.json | 0 .../ic_devices_ios.png | Bin .../ic_devices_ios@2x.png | Bin .../ic_devices_ios@3x.png | Bin .../ic_download.imageset/Contents.json | 0 .../ic_download.imageset/download-24@1x.png | Bin .../ic_download.imageset/download-24@2x.png | Bin .../ic_download.imageset/download-24@3x.png | Bin .../ic_flash_mode_auto.imageset/Contents.json | 0 .../flash-auto-32@1x.png | Bin .../flash-auto-32@2x.png | Bin .../flash-auto-32@3x.png | Bin .../ic_flash_mode_off.imageset/Contents.json | 0 .../flash-off-32@1x.png | Bin .../flash-off-32@2x.png | Bin .../flash-off-32@3x.png | Bin .../ic_flash_mode_on.imageset/Contents.json | 0 .../flash-on-32@1x.png | Bin .../flash-on-32@2x.png | Bin .../flash-on-32@3x.png | Bin .../Contents.json | 0 .../icon_GIF@1x.png | Bin .../icon_GIF@2x.png | Bin .../icon_GIF@3x.png | Bin .../Contents.json | 0 .../icon_video@1x.png | Bin .../icon_video@2x.png | Bin .../icon_video@3x.png | Bin .../ic_info.imageset/Contents.json | 0 .../ic_info.imageset/info-24@1x.png | Bin .../ic_info.imageset/info-24@2x.png | Bin .../ic_info.imageset/info-24@3x.png | Bin .../ic_lock_outline.imageset/Contents.json | 0 .../ic_lock_outline_white.png | Bin .../ic_lock_outline_white@2x.png | Bin .../ic_lock_outline_white@3x.png | Bin .../ic_mute_thread.imageset/Contents.json | 0 .../ic_mute_thread@1x.png | Bin .../ic_mute_thread@2x.png | Bin .../ic_mute_thread@3x.png | Bin .../ic_plus_24.imageset/Contents.json | 0 .../ic_plus_24.imageset/plus-24@1x.png | Bin .../ic_plus_24.imageset/plus-24@2x.png | Bin .../ic_plus_24.imageset/plus-24@3x.png | Bin .../ic_reply.imageset/Contents.json | 0 .../ic_reply.imageset/reply-24@1x.png | Bin .../ic_reply.imageset/reply-24@2x.png | Bin .../ic_reply.imageset/reply-24@3x.png | Bin .../Contents.json | 0 .../secret-sender-20@1x.png | Bin .../secret-sender-20@2x.png | Bin .../secret-sender-20@3x.png | Bin .../Contents.json | 0 ..._speaker_bluetooth_inactive_audio_mode.png | Bin .../Contents.json | 0 ..._speaker_bluetooth_inactive_video_mode.png | Bin .../ic_switch_camera.imageset/Contents.json | 0 .../switch-camera-32@1x.png | Bin .../switch-camera-32@2x.png | Bin .../switch-camera-32@3x.png | Bin .../ic_timer.imageset/Contents.json | 0 .../ic_timer.imageset/timer-24@1x.png | Bin .../ic_timer.imageset/timer-24@2x.png | Bin .../ic_timer.imageset/timer-24@3x.png | Bin .../ic_timer_disabled.imageset/Contents.json | 0 .../timer-disabled-24@1x.png | Bin .../timer-disabled-24@2x.png | Bin .../timer-disabled-24@3x.png | Bin .../ic_trash.imageset/Contents.json | 0 .../ic_trash.imageset/trash-24@1x.png | Bin .../ic_trash.imageset/trash-24@2x.png | Bin .../ic_trash.imageset/trash-24@3x.png | Bin .../ic_x_with_shadow.imageset/Contents.json | 0 .../ic_x_with_shadow.imageset/x-24@1x.png | Bin .../ic_x_with_shadow.imageset/x-24@2x.png | Bin .../ic_x_with_shadow.imageset/x-24@3x.png | Bin .../image_editor_brush.imageset/Contents.json | 0 .../marker-32@1x.png | Bin .../marker-32@2x.png | Bin .../marker-32@3x.png | Bin .../Contents.json | 0 .../caption-24@1x.png | Bin .../caption-24@2x.png | Bin .../caption-24@3x.png | Bin .../Contents.json | 0 .../checkmark-circle-outline-32@1x.png | Bin .../checkmark-circle-outline-32@2x.png | Bin .../checkmark-circle-outline-32@3x.png | Bin .../Contents.json | 0 .../checkmark-circle-filled-32@1x.png | Bin .../checkmark-circle-filled-32@2x.png | Bin .../checkmark-circle-filled-32@3x.png | Bin .../image_editor_crop.imageset/Contents.json | 0 .../image_editor_crop.imageset/crop-32@1x.png | Bin .../image_editor_crop.imageset/crop-32@2x.png | Bin .../image_editor_crop.imageset/crop-32@3x.png | Bin .../Contents.json | 0 .../crop-lock-32@1x.png | Bin .../crop-lock-32@2x.png | Bin .../crop-lock-32@3x.png | Bin .../Contents.json | 0 .../crop-unlock-32@1x.png | Bin .../crop-unlock-32@2x.png | Bin .../crop-unlock-32@3x.png | Bin .../image_editor_flip.imageset/Contents.json | 0 .../image_editor_flip.imageset/flip-32@1x.png | Bin .../image_editor_flip.imageset/flip-32@2x.png | Bin .../image_editor_flip.imageset/flip-32@3x.png | Bin .../Contents.json | 0 .../rotate-32@1x.png | Bin .../rotate-32@2x.png | Bin .../rotate-32@3x.png | Bin .../image_editor_text.imageset/Contents.json | 0 .../image_editor_text.imageset/text-32@1x.png | Bin .../image_editor_text.imageset/text-32@2x.png | Bin .../image_editor_text.imageset/text-32@3x.png | Bin .../image_editor_undo.imageset/Contents.json | 0 .../image_editor_undo.imageset/undo-32@1x.png | Bin .../image_editor_undo.imageset/undo-32@2x.png | Bin .../image_editor_undo.imageset/undo-32@3x.png | Bin .../Contents.json | 0 .../ios-rick-roll-dark@1x.png | Bin .../ios-rick-roll-dark@2x.png | Bin .../ios-rick-roll-dark@3x.png | Bin .../Contents.json | 0 .../ios-rick-roll-light@1x.png | Bin .../ios-rick-roll-light@2x.png | Bin .../ios-rick-roll-light@3x.png | Bin .../Contents.json | 0 .../signal-answer.png | Bin .../signal-answer@2x.png | Bin .../signal-answer@3x.png | Bin .../Contents.json | 0 .../signal-possum-far-wclouds@1x.png | Bin .../signal-possum-far-wclouds@2x.png | Bin .../signal-possum-far-wclouds@3x.png | Bin .../Contents.json | 0 .../introductory_splash_profile.png | Bin .../introductory_splash_profile@2x.png | Bin .../introductory_splash_profile@3x.png | Bin .../Contents.json | 0 .../signal-penguin-letter@1x.png | Bin .../signal-penguin-letter@2x.png | Bin .../signal-penguin-letter@3x.png | Bin .../Contents.json | 0 .../signal-video-splash.png | Bin .../signal-video-splash@2x.png | Bin .../signal-video-splash@3x.png | Bin .../logoSignal.imageset/Contents.json | 0 .../logoSignal.imageset/logoSignal.pdf | Bin .../Contents.json | 0 .../caption-shadow-24@1x.png | Bin .../caption-shadow-24@2x.png | Bin .../caption-shadow-24@3x.png | Bin .../media_invalid.imageset/Contents.json | 0 .../media_invalid.imageset/photo-error-36.png | Bin .../photo-error-36@2x.png | Bin .../photo-error-36@3x.png | Bin .../media_retry.imageset/Contents.json | 0 .../media_retry.imageset/retry-36.png | Bin .../media_retry.imageset/retry-36@2x.png | Bin .../media_retry.imageset/retry-36@3x.png | Bin .../Contents.json | 0 .../create-album-outline-32@1x.png | Bin .../create-album-outline-32@2x.png | Bin .../create-album-outline-32@3x.png | Bin .../Contents.json | 0 .../message-active-wide.png | Bin .../Contents.json | 0 .../delivered-18x12@1x.png | Bin .../double check@2x.png | Bin .../double check@3x.png | Bin .../Contents.json | 0 .../error-12@1x.png | Bin .../error-12@2x.png | Bin .../error-12@3x.png | Bin .../Contents.json | 0 .../error-20@1x.png | Bin .../error-20@2x.png | Bin .../error-20@3x.png | Bin .../Contents.json | 0 .../read-18x12@1x.png | Bin .../read-18x12@2x.png | Bin .../read-18x12@3x.png | Bin .../Contents.json | 0 .../sending@1x.png | Bin .../sending@2x.png | Bin .../sending@3x.png | Bin .../Contents.json | 0 .../sent-12@1x.png | Bin .../sent-12@2x.png | Bin .../sent-12@3x.png | Bin .../Contents.json | 0 .../navbar_disclosure_down_small@1x.png | Bin .../navbar_disclosure_down_small@2x.png | Bin .../navbar_disclosure_down_small@3x.png | Bin .../Contents.json | 0 .../navbar_disclosure_up_small@1x.png | Bin .../navbar_disclosure_up_small@2x.png | Bin .../navbar_disclosure_up_small@3x.png | Bin .../Contents.json | 0 .../note-24@1x.png | Bin .../note-24@2x.png | Bin .../note-24@3x.png | Bin .../Contents.json | 0 .../onboarding_splash.png | Bin .../play_button.imageset/Contents.json | 0 .../play_button.imageset/play_button@2x.png | Bin .../Contents.json | 0 .../profile_avatar_default@1x.png | Bin .../profile_avatar_default@2x.png | Bin .../profile_avatar_default@3x.png | Bin .../Contents.json | 0 .../quoted-message-cancel@1x.png | Bin .../quoted-message-cancel@2x.png | Bin .../quoted-message-cancel@3x.png | Bin .../searchbar_clear.imageset/Contents.json | 0 .../Search-clear_17x17_@1x.png | Bin .../Search-clear_17x17_@2x.png | Bin .../Search-clear_17x17_@3x.png | Bin .../searchbar_search.imageset/Contents.json | 0 .../UIButtonBarSearch_18x18_@1x.png | Bin .../UIButtonBarSearch_18x18_@2x.png | Bin .../UIButtonBarSearch_18x18_@3x.png | Bin .../BlueCheckSelected_31x31_@1x.png | Bin .../BlueCheckSelected_31x31_@2x.png | Bin .../BlueCheckSelected_31x31_@3x.png | Bin .../Contents.json | 0 .../Contents.json | 0 .../camera-filled-24@1x.png | Bin .../camera-filled-24@2x.png | Bin .../camera-filled-24@3x.png | Bin .../Contents.json | 0 .../settings-avatar-camera@1x.png | Bin .../settings-avatar-camera@2x.png | Bin .../settings-avatar-camera@3x.png | Bin .../settings.imageset/Contents.json | 0 .../settings.imageset/settings.pdf | 0 .../Contents.json | 0 .../VideoPlayer_Slider_Thumb_15x15_@1x.png | Bin .../VideoPlayer_Slider_Thumb_15x15_@2x.png | Bin .../VideoPlayer_Slider_Thumb_15x15_@3x.png | Bin .../small_chevron_left.imageset/Contents.json | 0 .../chevron_left_16@1x.png | Bin .../chevron_left_16@3x-1.png | Bin .../chevron_left_16@3x.png | Bin .../Contents.json | 0 .../chevron_right_16@1x.png | Bin .../chevron_right_16@2x.png | Bin .../chevron_right_16@3x.png | Bin .../Contents.json | 0 .../statJoinedGroup--blue.pdf | Bin .../Contents.json | 0 .../statLeftGroup--blue.pdf | Bin .../Contents.json | 0 .../statRefreshedGroup--blue.pdf | Bin .../Contents.json | 0 .../DisclosureIndicator@1x.png | Bin .../DisclosureIndicator@2x.png | Bin .../DisclosureIndicator@3x.png | Bin .../Contents.json | 0 .../DisclosureIndicatorRTL@1x.png | Bin .../DisclosureIndicatorRTL@2x.png | Bin .../DisclosureIndicatorRTL@3x.png | Bin .../Contents.json | 0 .../system_message_call@1x.png | Bin .../system_message_call@2x.png | Bin .../system_message_call@3x.png | Bin .../Contents.json | 0 .../timer-20@1x.png | Bin .../timer-20@2x.png | Bin .../timer-20@3x.png | Bin .../Contents.json | 0 .../timer-disabled-20@1x.png | Bin .../timer-disabled-20@2x.png | Bin .../timer-disabled-20@3x.png | Bin .../Contents.json | 0 .../system_message_security@1x.png | Bin .../system_message_security@2x.png | Bin .../system_message_security@3x.png | Bin .../Contents.json | 0 .../system_message_verified@1x.png | Bin .../system_message_verified@2x.png | Bin .../system_message_verified@3x.png | Bin .../Contents.json | 0 .../table_ic_add_to_existing_contact@1x.png | Bin .../table_ic_add_to_existing_contact@2x.png | Bin .../table_ic_add_to_existing_contact@3x.png | Bin .../table_ic_block.imageset/Contents.json | 0 .../table_ic_block@1x.png | Bin .../table_ic_block@2x.png | Bin .../table_ic_block@3x.png | Bin .../Contents.json | 0 .../table_ic_group_edit@1x.png | Bin .../table_ic_group_edit@2x.png | Bin .../table_ic_group_edit@3x.png | Bin .../Contents.json | 0 .../table_ic_group_leave@1x.png | Bin .../table_ic_group_leave@2x.png | Bin .../table_ic_group_leave@3x.png | Bin .../Contents.json | 0 .../table_ic_group_members@1x.png | Bin .../table_ic_group_members@2x.png | Bin .../table_ic_group_members@3x.png | Bin .../Contents.json | 0 .../table_ic_mute_thread@1x.png | Bin .../table_ic_mute_thread@2x.png | Bin .../table_ic_mute_thread@3x.png | Bin .../Contents.json | 0 .../table_ic_new_contact@1x.png | Bin .../table_ic_new_contact@2x.png | Bin .../table_ic_new_contact@3x.png | Bin .../Contents.json | 0 .../table_ic_not_verified@1x.png | Bin .../table_ic_not_verified@2x.png | Bin .../table_ic_not_verified@3x.png | Bin .../Contents.json | 0 .../table_ic_notification_sound@1x.png | Bin .../table_ic_notification_sound@2x.png | Bin .../table_ic_notification_sound@3x.png | Bin .../Contents.json | 0 .../table_ic_share_profile@1x.png | Bin .../table_ic_share_profile@2x.png | Bin .../table_ic_share_profile@3x.png | Bin .../table_ic_verify.imageset/Contents.json | 0 .../table_ic_verify@1x.png | Bin .../table_ic_verify@2x.png | Bin .../table_ic_verify@3x.png | Bin .../twitter_logo.imageset/Contents.json | 0 .../twitter_logo.imageset/twitter_logo.pdf | 0 .../Contents.json | 0 .../logo_with_background.png | Bin .../logo_with_background@2x.png | Bin .../logo_with_background@3x.png | Bin .../uiEmpty.imageset/Contents.json | 0 .../uiEmpty.imageset/uiEmpty.pdf | Bin .../uiEmptyContact.imageset/Contents.json | 0 .../uiEmptyContact.pdf | Bin .../Contents.json | 0 .../video-mute-selected.png | Bin .../Contents.json | 0 .../video-mute-unselected.png | Bin .../Contents.json | 0 .../switch_camera_large.png | Bin .../Contents.json | 0 .../video-video-selected.png | Bin .../Contents.json | 0 .../video-video-unselected.png | Bin .../voice-memo-button.imageset/Contents.json | 0 .../voice-memo-button-32.png | Bin .../voice-memo-button-64.png | Bin .../voice-memo-button-96.png | Bin .../Contents.json | 0 .../voice-message-large-white@1x.png | Bin .../voice-message-large-white@2x.png | Bin .../voice-message-large-white@3x.png | Bin .../x-24.imageset/Contents.json | 0 .../Images.xcassets/x-24.imageset/x-24@1x.png | Bin .../Images.xcassets/x-24.imageset/x-24@2x.png | Bin .../Images.xcassets/x-24.imageset/x-24@3x.png | Bin .../{ => Meta}/Images/audio_pause_button.png | Bin .../Images/audio_pause_button@2x.png | Bin .../Images/audio_pause_button_blue.png | Bin .../Images/audio_pause_button_blue@2x.png | Bin .../{ => Meta}/Images/audio_play_button.png | Bin .../Images/audio_play_button@2x.png | Bin .../Images/audio_play_button_blue.png | Bin .../Images/audio_play_button_blue@2x.png | Bin Session/{ => Meta}/Images/call@2x.png | Bin .../Images/contact_default_feed.png | Bin Session/{ => Meta}/Images/endcall@2x.png | Bin Session/{ => Meta}/Images/error_white@2x.png | Bin Session/{ => Meta}/Images/mute_off@2x.png | Bin Session/{ => Meta}/Images/mute_on@2x.png | Bin Session/{ => Meta}/Images/pause_icon.png | Bin Session/{ => Meta}/Images/pause_icon@2x.png | Bin Session/{ => Meta}/Images/play_icon.png | Bin Session/{ => Meta}/Images/play_icon@2x.png | Bin Session/{ => Meta}/Images/qr@2x.png | Bin Session/{ => Meta}/Images/quit@2x.png | Bin Session/{ => Meta}/Images/savephoto@2x.png | Bin .../Images/typing-animation-dark.gif | Bin .../{ => Meta}/Images/typing-animation.gif | Bin .../{ => Meta}/Images/warning_white@2x.png | Bin .../Settings.bundle/Acknowledgements.plist | 0 .../Meta}/Settings.bundle/Root.plist | 0 .../en.lproj/Acknowledgements.strings | 0 .../Settings.bundle/en.lproj/Root.strings | Bin .../{src => Meta}/Signal-Bridging-Header.h | 2 - Session/{ => Meta}/Signal-Info.plist | 0 Session/{ => Meta}/Signal-Prefix.pch | 0 Session/{ => Meta}/Signal.entitlements | 0 Session/{ => Meta}/SignalTSan.supp | 0 Session/{ => Meta}/SignalUBSan.supp | 0 .../Translations}/.tx/config | 0 .../an_translation | Bin .../ar_translation | Bin .../bg_BG_translation | Bin .../ca_translation | Bin .../cs_translation | Bin .../da_translation | Bin .../de_translation | Bin .../es_translation | Bin .../eu_translation | Bin .../fa_IR_translation | Bin .../fa_translation | Bin .../fi_translation | Bin .../fil_translation | Bin .../fr_translation | Bin .../he_translation | Bin .../hu_translation | Bin .../it_IT_translation | Bin .../ja_JP_translation | Bin .../lv_translation | Bin .../nb_translation | Bin .../nl_translation | Bin .../pl_translation | Bin .../pt_BR_translation | Bin .../ro_translation | Bin .../ru_translation | Bin .../sl_translation | Bin .../sq_translation | Bin .../sv_SE_translation | Bin .../ta_translation | Bin .../tr_TR_translation | Bin .../uk_translation | Bin .../zh_CN_translation | Bin .../zh_TW.Big5_translation | Bin .../zh_TW_translation | Bin .../Migrating Translations from Android.md | 0 .../Translations}/TRANSLATIONS.md | 0 .../Translations}/bin/auto-genstrings | 0 .../Translations}/bin/pull-translations | 0 .../Translations}/bin/push-translation-source | 0 .../Translations}/bin/sync-translations | 0 .../de.lproj/Localizable.strings | 0 .../en.lproj/Localizable.strings | 0 .../es.lproj/Localizable.strings | 0 .../fa.lproj/Localizable.strings | 0 .../fr.lproj/Localizable.strings | 0 .../id-ID.lproj/Localizable.strings | 0 .../it.lproj/Localizable.strings | 0 .../ja.lproj/Localizable.strings | 0 .../pl.lproj/Localizable.strings | 0 .../pt_BR.lproj/Localizable.strings | 0 .../ru.lproj/Localizable.strings | 0 .../vi-VN.lproj/Localizable.strings | 0 .../zh_CN.lproj/Localizable.strings | 0 Session/{ => Meta}/main.m | 0 .../AVAudioSession+OWS.h | 0 .../AVAudioSession+OWS.m | 0 .../AboutTableViewController.h | 0 .../AboutTableViewController.m | 0 .../Models => Signal}/AccountManager.swift | 0 ...ShareToExistingContactViewController.swift | 0 .../AddToBlockListViewController.h | 0 .../AddToBlockListViewController.m | 0 .../AddToGroupViewController.h | 0 .../AddToGroupViewController.m | 0 .../AdvancedSettingsTableViewController.h | 0 .../AdvancedSettingsTableViewController.m | 0 Session/{src => Signal}/AppDelegate.h | 0 Session/{src => Signal}/AppDelegate.m | 0 .../AppEnvironment.swift | 0 .../AppNotifications.swift | 0 .../{src/util => Signal}/AppUpdateNag.swift | 0 .../views => Signal}/AudioProgressView.swift | 0 .../AvatarTableViewCell.swift | 0 .../AvatarViewHelper.h | 0 .../AvatarViewHelper.m | 0 .../BackupRestoreViewController.swift | 0 .../BlockListViewController.h | 0 .../BlockListViewController.m | 0 .../call => Signal}/CallAudioService.swift | 0 .../CallKitCallManager.swift | 0 .../CallKitCallUIAdaptee.swift | 0 .../{src/call => Signal}/CallService.swift | 0 .../CallUIAdapter.swift | 0 .../Call => Signal}/CallVideoHintView.swift | 2 +- .../Call => Signal}/CallViewController.swift | 0 .../{src/views => Signal}/CaptionView.swift | 0 .../ColorPickerViewController.swift | 0 .../CompareSafetyNumbersActivity.swift | 0 .../{src/views => Signal}/ContactCell.swift | 0 .../ContactShareViewHelper.swift | 0 .../ContactViewController.swift | 0 .../ContactsPicker.swift | 0 ...nversationConfigurationSyncOperation.swift | 0 .../{src => Signal}/ConversationSearch.swift | 0 .../Cells/AttachmentUploadView.h | 0 .../Cells/AttachmentUploadView.m | 0 .../Cells/ConversationMediaView.swift | 0 .../Cells/ConversationViewCell.h | 0 .../Cells/ConversationViewCell.m | 0 .../Cells/MediaAlbumCellView.swift | 0 .../Cells/MediaDownloadView.swift | 0 .../Cells/MediaUploadView.swift | 0 .../Cells/OWSBubbleShapeView.h | 0 .../Cells/OWSBubbleShapeView.m | 0 .../ConversationView/Cells/OWSBubbleView.h | 0 .../ConversationView/Cells/OWSBubbleView.m | 0 .../Cells/OWSContactOffersCell.h | 0 .../Cells/OWSContactOffersCell.m | 0 .../Cells/OWSContactShareButtonsView.h | 0 .../Cells/OWSContactShareButtonsView.m | 0 .../Cells/OWSContactShareView.h | 0 .../Cells/OWSContactShareView.m | 0 .../Cells/OWSGenericAttachmentView.h | 0 .../Cells/OWSGenericAttachmentView.m | 0 .../ConversationView/Cells/OWSLabel.h | 0 .../ConversationView/Cells/OWSLabel.m | 0 .../Cells/OWSMessageBubbleView.h | 0 .../Cells/OWSMessageBubbleView.m | 0 .../ConversationView/Cells/OWSMessageCell.h | 0 .../ConversationView/Cells/OWSMessageCell.m | 0 .../Cells/OWSMessageFooterView.h | 0 .../Cells/OWSMessageFooterView.m | 0 .../Cells/OWSMessageHeaderView.h | 0 .../Cells/OWSMessageHeaderView.m | 0 .../Cells/OWSMessageTextView.h | 0 .../Cells/OWSMessageTextView.m | 0 .../Cells/OWSMessageTimerView.h | 0 .../Cells/OWSMessageTimerView.m | 0 .../Cells/OWSQuotedMessageView.h | 0 .../Cells/OWSQuotedMessageView.m | 0 .../Cells/OWSSystemMessageCell.h | 0 .../Cells/OWSSystemMessageCell.m | 0 .../Cells/TypingIndicatorCell.swift | 0 .../ConversationCollectionView.h | 0 .../ConversationCollectionView.m | 0 .../ConversationHeaderView.swift | 0 .../ConversationInputTextView.h | 0 .../ConversationInputTextView.m | 0 .../ConversationInputToolbar.h | 0 .../ConversationInputToolbar.m | 0 .../ConversationMessageMapping.swift | 0 .../ConversationScrollButton.h | 0 .../ConversationScrollButton.m | 0 .../ConversationViewController.h | 0 .../ConversationViewController.m | 1 - .../ConversationView/ConversationViewItem.h | 0 .../ConversationView/ConversationViewItem.m | 0 .../ConversationView/ConversationViewLayout.h | 0 .../ConversationView/ConversationViewLayout.m | 0 .../ConversationView/ConversationViewModel.h | 0 .../ConversationView/ConversationViewModel.m | 0 .../TypingIndicatorInteraction.swift | 0 .../CropScaleImageViewController.swift | 0 Session/{src/util => Signal}/DateUtil.h | 0 Session/{src/util => Signal}/DateUtil.m | 0 .../DismissableTextField.swift | 0 .../DomainFrontingCountryViewController.h | 0 .../DomainFrontingCountryViewController.m | 0 .../ExperienceUpgrade.swift | 0 .../ExperienceUpgradeFinder.swift | 0 .../FingerprintViewController.h | 0 .../FingerprintViewController.m | 0 .../FingerprintViewScanController.h | 0 .../FingerprintViewScanController.m | 0 .../GifPicker => Signal}/GifPickerCell.swift | 0 .../GifPickerLayout.swift | 0 .../GifPickerViewController.swift | 0 .../{src/network => Signal}/GiphyAPI.swift | 0 .../network => Signal}/GiphyDownloader.swift | 0 .../views => Signal}/GroupTableViewCell.swift | 0 .../HapticFeedback.swift | 0 .../ImagePickerController.swift | 0 .../InviteFlow.swift | 0 .../util => Signal}/Launch Screen.storyboard | 0 .../LegacyNotificationsAdaptee.swift | 0 .../views => Signal}/LinkPreviewView.swift | 0 .../LoadingViewController.swift | 0 .../LongTextViewController.swift | 0 .../Storyboard => Signal}/Main.storyboard | 0 Session/{src/util => Signal}/MainAppContext.h | 0 Session/{src/util => Signal}/MainAppContext.m | 0 .../{src/views => Signal}/MarqueeLabel.swift | 0 .../MediaDetailViewController.h | 0 .../MediaDetailViewController.m | 0 .../MediaGalleryViewController.swift | 0 .../MediaPageViewController.swift | 0 .../MediaTileViewController.swift | 0 .../MenuActionsViewController.swift | 0 .../Models => Signal}/MessageActions.swift | 0 .../MessageDetailViewController.swift | 0 .../Jobs => Signal}/MessageFetcherJob.swift | 0 .../MessageRecipientStatusUtils.swift | 0 .../views => Signal}/NeverClearView.swift | 0 .../NonCallKitCallUIAdaptee.swift | 0 ...otificationSettingsOptionsViewController.h | 0 ...otificationSettingsOptionsViewController.m | 0 .../NotificationSettingsViewController.h | 0 .../NotificationSettingsViewController.m | 0 .../OWSAddToContactViewController.h | 0 .../OWSAddToContactViewController.m | 0 .../{src/util => Signal}/OWSAnalytics.swift | 0 .../{src/util/Backup => Signal}/OWSBackup.h | 0 .../{src/util/Backup => Signal}/OWSBackup.m | 0 .../util/Backup => Signal}/OWSBackupAPI.swift | 0 .../Backup => Signal}/OWSBackupExportJob.h | 0 .../Backup => Signal}/OWSBackupExportJob.m | 0 .../{src/util/Backup => Signal}/OWSBackupIO.h | 0 .../{src/util/Backup => Signal}/OWSBackupIO.m | 0 .../Backup => Signal}/OWSBackupImportJob.h | 0 .../Backup => Signal}/OWSBackupImportJob.m | 0 .../util/Backup => Signal}/OWSBackupJob.h | 0 .../util/Backup => Signal}/OWSBackupJob.m | 0 .../OWSBackupLazyRestore.swift | 0 .../OWSBackupSettingsViewController.h | 0 .../OWSBackupSettingsViewController.m | 0 .../{src/views => Signal}/OWSBezierPathView.h | 0 .../{src/views => Signal}/OWSBezierPathView.m | 0 .../OWSConversationSettingsViewController.h | 0 .../OWSConversationSettingsViewController.m | 0 .../OWSConversationSettingsViewDelegate.h | 0 .../OWSDeviceProvisioningURLParser.h | 0 .../OWSDeviceProvisioningURLParser.m | 0 .../views => Signal}/OWSDeviceTableViewCell.h | 0 .../views => Signal}/OWSDeviceTableViewCell.m | 0 .../OWSImagePickerController.swift | 0 .../util => Signal}/OWSOrphanDataCleaner.h | 0 .../util => Signal}/OWSOrphanDataCleaner.m | 0 .../{src/views => Signal}/OWSProgressView.h | 0 .../{src/views => Signal}/OWSProgressView.m | 0 .../OWSQRCodeScanningViewController.h | 0 .../OWSQRCodeScanningViewController.m | 0 .../{src/util => Signal}/OWSScreenLockUI.h | 0 .../{src/util => Signal}/OWSScreenLockUI.m | 0 .../OWSSessionResetJobRecord.h | 0 .../OWSSessionResetJobRecord.m | 0 .../OWSSoundSettingsViewController.h | 0 .../OWSSoundSettingsViewController.m | 0 .../OWSWebRTCDataProtos.pb.swift | 0 .../OnboardingCaptchaViewController.swift | 0 .../OutboundCallInitiator.swift | 0 Session/{src/util => Signal}/Pastelog.h | 0 Session/{src/util => Signal}/Pastelog.m | 0 .../PeerConnectionClient.swift | 0 .../Photos => Signal}/PhotoCapture.swift | 0 .../PhotoCaptureViewController.swift | 0 .../PhotoCollectionPickerController.swift | 0 .../views => Signal}/PhotoGridViewCell.swift | 0 .../Photos => Signal}/PhotoLibrary.swift | 0 Session/{src/views => Signal}/PinEntryView.h | 0 Session/{src/views => Signal}/PinEntryView.m | 0 Session/{src/util => Signal}/Platform.swift | 0 .../PrivacySettingsTableViewController.h | 0 .../PrivacySettingsTableViewController.m | 0 .../PushRegistrationManager.swift | 0 .../views => Signal}/QuotedReplyPreview.swift | 0 .../{src/views => Signal}/ReminderView.swift | 0 .../{src/views => Signal}/RemoteVideoView.h | 0 .../{src/views => Signal}/RemoteVideoView.m | 0 .../SafetyNumberConfirmationAlert.swift | 0 .../SendMediaNavigationController.swift | 0 .../Jobs => Signal}/SessionResetJob.swift | 0 .../ShowGroupMembersViewController.h | 0 .../ShowGroupMembersViewController.m | 0 .../{src/environment => Signal}/SignalApp.h | 0 .../{src/environment => Signal}/SignalApp.m | 0 Session/{src/call => Signal}/SignalCall.swift | 0 .../SignalsNavigationController.h | 0 .../SignalsNavigationController.m | 0 .../Jobs => Signal}/SyncPushTokensJob.swift | 0 .../util => Signal}/TextFieldHelper.swift | 0 .../{src/call => Signal}/TurnServerInfo.swift | 0 .../TypingIndicatorView.swift | 0 Session/{src => Signal}/UIAlerts+iOS9.m | 0 .../{src => Signal}/UIApplication+OWS.swift | 0 .../UIResponder+OWS.swift | 0 .../{src => Signal}/UIStoryboard+OWS.swift | 0 .../UIViewController+CameraPermissions.h | 0 .../UIViewController+Permissions.h | 0 .../UIViewController+Permissions.m | 0 .../UpdateGroupViewController.h | 0 .../UpdateGroupViewController.m | 0 .../UserNotificationsAdaptee.swift | 0 .../{src/views => Signal}/VoiceNoteLock.swift | 0 .../WebRTCCallMessageHandler.swift | 0 .../Generated => Signal}/WebRTCProto.swift | 0 .../Utilities/AppearanceUtilities.swift | 0 .../Loki => }/Utilities/AudioUtilities.swift | 0 .../Utilities/BackgroundPoller.swift | 0 .../Utilities/CGRect+Utilities.swift | 0 .../Utilities/ContactUtilities.swift | 0 .../{src/Loki => }/Utilities/IP2Country.swift | 0 .../Utilities/KeyPairGeneration.swift | 0 .../Utilities/KeyPairUtilities.swift | 0 .../Utilities/MentionUtilities.swift | 0 Session/{src/Loki => }/Utilities/QRCode.swift | 0 .../Utilities/Sodium+Conversion.swift | 0 .../Loki => }/Utilities/UIImage+Scaling.swift | 0 .../Utilities/UILabel+Interaction.swift | 0 .../Loki => }/Utilities/UIView+Glow.swift | 0 .../Loki => }/Utilities/UIView+Wrapping.swift | 0 .../Loki => }/View Controllers/BaseVC.swift | 0 .../View Controllers/DeviceLinkingModal.swift | 0 .../DeviceLinkingModalDelegate.swift | 0 .../View Controllers/DeviceLinksVC.swift | 0 .../View Controllers/DeviceNameModal.swift | 0 .../DeviceNameModalDelegate.swift | 0 .../View Controllers/DisplayNameVC.swift | 0 .../View Controllers/EditClosedGroupVC.swift | 0 .../View Controllers/GroupMembersVC.swift | 0 .../Loki => }/View Controllers/HomeVC.swift | 0 .../View Controllers/JoinPublicChatVC.swift | 0 .../View Controllers/LandingVC.swift | 0 .../View Controllers/LightModeSheet.swift | 0 .../View Controllers/LinkDeviceVC.swift | 0 .../LinkDeviceVCDelegate.swift | 0 .../Loki => }/View Controllers/Modal.swift | 0 .../MultiDeviceRemovalSheet.swift | 0 .../View Controllers/NewClosedGroupVC.swift | 0 .../View Controllers/NewPrivateChatVC.swift | 0 .../View Controllers/NukeDataModal.swift | 0 .../OpenGroupSuggestionSheet.swift | 0 .../Loki => }/View Controllers/PNModeVC.swift | 0 .../Loki => }/View Controllers/PathVC.swift | 0 .../Loki => }/View Controllers/QRCodeVC.swift | 0 .../View Controllers/RegisterVC.swift | 0 .../View Controllers/RestoreVC.swift | 0 .../ScanQRCodeWrapperVC.swift | 0 .../View Controllers/SeedModal.swift | 0 .../Loki => }/View Controllers/SeedVC.swift | 0 .../View Controllers/SettingsVC.swift | 0 .../Loki => }/View Controllers/Sheet.swift | 0 .../View Controllers/UserSelectionVC.swift | 0 Session/iTunesArtwork@3x.png | Bin 14942 -> 0 bytes Session/src/UserInterface/OWSLayerView.swift | 50 - .../DebugSettingsTableViewController.m | 75 - .../DebugUI/DebugContactsUtils.h | 25 - .../DebugUI/DebugContactsUtils.m | 1259 ----- .../ViewControllers/DebugUI/DebugUIBackup.h | 13 - .../ViewControllers/DebugUI/DebugUIBackup.m | 258 - .../DebugUI/DebugUICalling.swift | 75 - .../ViewControllers/DebugUI/DebugUIContacts.h | 16 - .../ViewControllers/DebugUI/DebugUIContacts.m | 120 - .../DebugUI/DebugUIDiskUsage.h | 13 - .../DebugUI/DebugUIDiskUsage.m | 116 - .../DebugUI/DebugUIFileBrowser.swift | 378 -- .../ViewControllers/DebugUI/DebugUIMessages.h | 13 - .../ViewControllers/DebugUI/DebugUIMessages.m | 4863 ----------------- .../DebugUI/DebugUIMessagesAction.h | 62 - .../DebugUI/DebugUIMessagesAction.m | 288 - .../DebugUI/DebugUIMessagesAssetLoader.h | 52 - .../DebugUI/DebugUIMessagesAssetLoader.m | 628 --- .../DebugUI/DebugUIMessagesUtils.h | 18 - .../src/ViewControllers/DebugUI/DebugUIMisc.h | 13 - .../src/ViewControllers/DebugUI/DebugUIMisc.m | 337 -- .../DebugUI/DebugUINotifications.swift | 174 - .../src/ViewControllers/DebugUI/DebugUIPage.h | 27 - .../src/ViewControllers/DebugUI/DebugUIPage.m | 30 - .../DebugUI/DebugUIProfile.swift | 62 - .../DebugUI/DebugUISessionState.h | 15 - .../DebugUI/DebugUISessionState.m | 141 - .../ViewControllers/DebugUI/DebugUIStress.h | 15 - .../ViewControllers/DebugUI/DebugUIStress.m | 580 -- .../DebugUI/DebugUISyncMessages.h | 15 - .../DebugUI/DebugUISyncMessages.m | 126 - .../DebugUI/DebugUITableViewController.h | 20 - .../DebugUI/DebugUITableViewController.m | 152 - Session/test/Assets/test-gif.gif | Bin 690760 -> 0 bytes Session/test/Assets/test-jpg.JPG | Bin 78239 -> 0 bytes Session/test/Assets/test-mp3.mp3 | Bin 4421159 -> 0 bytes Session/test/Assets/test-mp4.mp4 | Bin 1433954 -> 0 bytes Session/test/Models/MantlePerfTest.swift | 42 - .../OWSDeviceProvisioningURLParserTest.m | 49 - Session/test/SSKTests/ParamParserTest.swift | 118 - .../test/SSKTests/SSKProtoEnvelopeTest.swift | 103 - Session/test/SignalBaseTest.h | 20 - Session/test/SignalBaseTest.m | 54 - Session/test/SignalTests-Bridging-Header.h | 6 - .../Supporting Files/SignalTests-Info.plist | 22 - Session/test/Supporting Files/whisperFake.cer | Bin 1026 -> 0 bytes Session/test/TestUtil.h | 12 - .../ConversationViewItemTest.m | 275 - .../test/call/PeerConnectionClientTest.swift | 139 - Session/test/mocks/MockEnvironment.h | 22 - Session/test/mocks/MockEnvironment.m | 47 - Session/test/util/ByteParserTest.swift | 221 - Session/test/util/CDSSigningCertificateTest.m | 197 - .../test/util/DisplayableTextFilterTest.swift | 165 - Session/test/util/ExceptionsTest.h | 9 - Session/test/util/FunctionalUtilTest.m | 49 - Session/test/util/ImageCacheTest.swift | 61 - Session/test/util/OWSDatabaseConverterTest.m | 1165 ---- Session/test/util/OWSOrphanDataCleanerTest.m | 252 - .../test/util/OWSScrubbingLogFormatterTest.m | 148 - Session/test/util/ProtoParsingTest.m | 179 - Session/test/util/SearcherTest.swift | 434 -- Session/test/util/StringAdditionsTest.swift | 126 - .../util/TSStorageIdentityKeyStoreTests.m | 95 - Session/test/util/TSStoragePreKeyStoreTests.m | 63 - .../test/util/TSStorageSignedPreKeyStore.m | 25 - Session/test/util/UtilTest.h | 9 - Session/test/util/UtilTest.m | 276 - .../ImageEditor/ImageEditorModelTest.swift | 83 - .../views/ImageEditor/ImageEditorTest.swift | 111 - Signal.xcodeproj/project.pbxproj | 915 +--- 1265 files changed, 219 insertions(+), 15307 deletions(-) rename Session/{src/Loki => }/Components/ConversationCell.swift (100%) rename Session/{src/Loki => }/Components/ConversationTitleView.swift (100%) rename Session/{src/Loki => }/Components/FakeChatView.swift (100%) rename Session/{src/Loki => }/Components/MentionCandidateSelectionView.swift (100%) rename Session/{src/Loki => }/Components/NewConversationButtonSet.swift (100%) rename Session/{src/Loki => }/Components/PNOptionView.swift (100%) rename Session/{src/Loki => }/Components/PathStatusView.swift (100%) rename Session/{src/Loki => }/Components/SeedReminderView.swift (100%) rename Session/{src/Loki => }/Components/SessionRestorationView.swift (100%) rename Session/{src/Loki => }/Components/UserCell.swift (100%) rename Session/{src/Loki => }/Components/VoiceMessageView.swift (100%) rename Session/{src/Loki => }/Database/Storage+VolumeSamples.swift (100%) rename Session/{src/Loki => }/Dependencies/SRCopyableLabel.swift (100%) rename Session/{src/Loki => }/Dependencies/SwiftCSV/CSV.swift (100%) rename Session/{src/Loki => }/Dependencies/SwiftCSV/Description.swift (100%) rename Session/{src/Loki => }/Dependencies/SwiftCSV/EnumeratedView.swift (100%) rename Session/{src/Loki => }/Dependencies/SwiftCSV/NamedView.swift (100%) rename Session/{src/Loki => }/Dependencies/SwiftCSV/Parser.swift (100%) rename Session/{src/Loki => }/Dependencies/SwiftCSV/ParsingState.swift (100%) rename Session/{src/Loki => }/Dependencies/SwiftCSV/String+Lines.swift (100%) rename Session/{ => Meta}/AudioFiles/NewMessage.aifc (100%) rename Session/{ => Meta}/AudioFiles/busy_tone_ansi.caf (100%) rename Session/{ => Meta}/AudioFiles/end_call_tone_cept.caf (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/aurora-quiet.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/aurora.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/bamboo-quiet.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/bamboo.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/chord-quiet.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/chord.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/circles-quiet.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/circles.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/classic-quiet.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/classic.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/complete-quiet.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/complete.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/hello-quiet.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/hello.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/input-quiet.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/input.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/keys-quiet.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/keys.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/make-quiet.sh (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/note-quiet.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/note.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/popcorn-quiet.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/popcorn.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/pulse-quiet.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/pulse.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/synth-quiet.aifc (100%) rename Session/{ => Meta}/AudioFiles/messageReceivedSounds/synth.aifc (100%) rename Session/{ => Meta}/AudioFiles/message_sent.aiff (100%) rename Session/{ => Meta}/AudioFiles/ringback_tone_ansi.caf (100%) rename Session/{ => Meta}/AudioFiles/ringtoneSounds/Opening.m4r (100%) rename Session/{ => Meta}/AudioFiles/sonarping.mp3 (100%) rename Session/{ => Meta}/CSV/GeoLite2-Country-Blocks-IPv4.csv (100%) rename Session/{ => Meta}/CSV/GeoLite2-Country-Locations-English.csv (100%) rename Session/{ => Meta}/Fonts/ElegantIcons.ttf (100%) rename Session/{ => Meta/Fonts}/SpaceMono-Bold.ttf (100%) rename Session/{Fonts/Loki => Meta/Fonts}/SpaceMono-Regular.ttf (100%) rename Session/{ => Meta}/Fonts/dripicons-v2.ttf (100%) rename Session/{ => Meta}/Fonts/fontawesome-webfont.ttf (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-1024.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-120.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-121.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-152.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-167.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-180.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-20.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-29.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-30.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-40.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-41.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-42.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-58.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-59.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-60.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-76.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-80.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-81.png (100%) rename Session/{ => Meta}/Images.xcassets/AppIcon.appiconset/Icon-87.png (100%) rename Session/{ => Meta}/Images.xcassets/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/AddPerson.imageset/AddPerson.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/AddPerson.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/ArrowUpDarkMode.imageset/ArrowUp.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/ArrowUpDarkMode.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/ArrowUpLightMode.imageset/ArrowUpLightMode.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/ArrowUpLightMode.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/ChatBubbles.imageset/ChatBubbles.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/ChatBubbles.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Check.imageset/Check.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Check.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Circle.imageset/Circle.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Circle.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/CircleCheck.imageset/CircleCheck.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/CircleCheck.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/CircleDotDotDot.imageset/CircleDotDotDot.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/CircleDotDotDot.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/CirclePause.imageset/CirclePause.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/CirclePause.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/CirclePlay.imageset/CirclePlay.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/CirclePlay.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/CirclePlus.imageset/CirclePlus.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/CirclePlus.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/FilledCircleCheckDarkMode.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/FilledCircleCheckDarkMode.imageset/FilledCircleCheckDarkMode.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/FilledCircleCheckLightMode.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/FilledCircleCheckLightMode.imageset/FilledCircleCheckLightMode.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Flag.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Flag.imageset/Flag.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Gear.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Gear.imageset/Gear.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Globe.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Globe.imageset/Globe.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Group.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Group.imageset/Group.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Key.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Key.imageset/Key.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/MagnifyingGlass.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/MagnifyingGlass.imageset/MagnifyingGlass.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Message.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Message.imageset/Message.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Microphone.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Microphone.imageset/Microphone.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Mute.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Mute.imageset/Mute.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Pause.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Pause.imageset/Pause.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/People.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/People.imageset/People.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Play.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Play.imageset/Play.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Plus.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Plus.imageset/Plus.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/QRCode.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/QRCode.imageset/QRCodeFilled.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/QuestionMark.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/QuestionMark.imageset/QuestionMark.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionGreen32.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionGreen32.imageset/SessionGreen32.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionGreen32.imageset/SessionGreen32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionGreen32.imageset/SessionGreen32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionGreen64.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionGreen64.imageset/SessionGreen64.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionGreen64.imageset/SessionGreen64@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionGreen64.imageset/SessionGreen64@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionWhite16.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionWhite16.imageset/SessionWhite16.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionWhite16.imageset/SessionWhite16@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionWhite16.imageset/SessionWhite16@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionWhite24.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionWhite24.imageset/SessionWhite24.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionWhite24.imageset/SessionWhite24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionWhite24.imageset/SessionWhite24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionWhite40.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionWhite40.imageset/SessionWhite40.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionWhite40.imageset/SessionWhite40@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/SessionWhite40.imageset/SessionWhite40@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Star.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Star.imageset/StarOutline.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Sun.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/Sun.imageset/Sun.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/X.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki V2/X.imageset/X.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki/Cog.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki/Cog.imageset/pow.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki/Cog.imageset/pow@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki/Cog.imageset/pow@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/Loki/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki/Crown.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki/Crown.imageset/crown.pdf (100%) rename Session/{ => Meta}/Images.xcassets/Loki/Loki.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/Loki/Loki.imageset/Loki_Logo_Icon_White.pdf (100%) rename Session/{ => Meta}/Images.xcassets/NavBarBack.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/NavBarBack.imageset/NavBarBackWhite@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/NavBarBack.imageset/NavBarBackWhite@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/NavBarBack.imageset/NavBarBackWhite@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/NavBarBackRTL.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/NavBarBackRTL.imageset/NavBarBackWhiteRTL@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/NavBarBackRTL.imageset/NavBarBackWhiteRTL@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/NavBarBackRTL.imageset/NavBarBackWhiteRTL@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/NavBarBackWithShadow.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/NavBarBackWithShadow.imageset/chevron-left-shadow-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/NavBarBackWithShadow.imageset/chevron-left-shadow-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/NavBarBackWithShadow.imageset/chevron-left-shadow-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/NavBarBackWithShadowRTL.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/NavBarBackWithShadowRTL.imageset/chevron-right-shadow-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/NavBarBackWithShadowRTL.imageset/chevron-right-shadow-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/NavBarBackWithShadowRTL.imageset/chevron-right-shadow-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/_arrow_button.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/_arrow_button.imageset/btnBack--white.pdf (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_camera_black.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_camera_black.imageset/actionsheet_camera_black@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_camera_black.imageset/actionsheet_camera_black@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_camera_black.imageset/actionsheet_camera_black@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_camera_roll_black.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_camera_roll_black.imageset/actionsheet_camera_roll_black@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_camera_roll_black.imageset/actionsheet_camera_roll_black@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_camera_roll_black.imageset/actionsheet_camera_roll_black@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_contact.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_contact.imageset/person_outline_24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_contact.imageset/person_outline_24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_contact.imageset/person_outline_24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_document_black.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_document_black.imageset/actionsheet_document_black@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_document_black.imageset/actionsheet_document_black@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_document_black.imageset/actionsheet_document_black@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_gif_black.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/add-conversation.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/add-conversation.imageset/add_conversation.pdf (100%) rename Session/{ => Meta}/Images.xcassets/album_add_more.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/album_add_more.imageset/create-album-outline-32@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/album_add_more.imageset/create-album-outline-32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/album_add_more.imageset/create-album-outline-32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/attachment_audio.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/attachment_audio.imageset/attachment_audio@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/attachment_audio.imageset/attachment_audio@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/attachment_audio.imageset/attachment_audio@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/attachment_file.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/attachment_file.imageset/attachment_file@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/attachment_file.imageset/attachment_file@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/attachment_file.imageset/attachment_file@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/attachment_play_button.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/attachment_play_button.imageset/attachment_play_button@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/attachment_play_button.imageset/attachment_play_button@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/attachment_play_button.imageset/attachment_play_button@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/audio-call-mute-active.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/audio-call-mute-active.imageset/ic_mute_active.png (100%) rename Session/{ => Meta}/Images.xcassets/audio-call-mute-inactive.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/audio-call-mute-inactive.imageset/ic_mute_inactive.png (100%) rename Session/{ => Meta}/Images.xcassets/audio-call-speaker-active.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/audio-call-speaker-active.imageset/ic_speaker_active.png (100%) rename Session/{ => Meta}/Images.xcassets/audio-call-speaker-inactive.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/audio-call-speaker-inactive.imageset/ic_speaker_inactive.png (100%) rename Session/{ => Meta}/Images.xcassets/audio-call-video-active.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/audio-call-video-active.imageset/ic_video_active.png (100%) rename Session/{ => Meta}/Images.xcassets/audio-call-video-inactive.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/audio-call-video-inactive.imageset/ic_video_inactive.png (100%) rename Session/{ => Meta}/Images.xcassets/audio_pause_black_48.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/audio_pause_black_48.imageset/pause-48@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/audio_pause_black_48.imageset/pause-48@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/audio_pause_black_48.imageset/pause-48@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/audio_pause_black_large.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/audio_pause_black_large.imageset/audio_pause_black_large@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/audio_pause_black_large.imageset/audio_pause_black_large@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/audio_pause_black_large.imageset/audio_pause_black_large@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/audio_play_black_48.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/audio_play_black_48.imageset/play-48@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/audio_play_black_48.imageset/play-48@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/audio_play_black_48.imageset/play-48@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/audio_play_black_large.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/audio_play_black_large.imageset/audio_play_black_large@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/audio_play_black_large.imageset/audio_play_black_large@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/audio_play_black_large.imageset/audio_play_black_large@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/banner_close.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/banner_close.imageset/banner_close@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/banner_close.imageset/banner_close@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/banner_close.imageset/banner_close@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/btnCancel--blue.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/btnCancel--blue.imageset/btnCancel--blue.pdf (100%) rename Session/{ => Meta}/Images.xcassets/btnCancel--white.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/btnCancel--white.imageset/cancel.pdf (100%) rename Session/{ => Meta}/Images.xcassets/btnGroup--white.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/btnGroup--white.imageset/add_group.pdf (100%) rename Session/{ => Meta}/Images.xcassets/btnQRShow--white-1.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/btnQRShow--white-1.imageset/btnQRShow--white.pdf (100%) rename Session/{ => Meta}/Images.xcassets/btnQRShow--white.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/btnQRShow--white.imageset/btnQRShow--white.pdf (100%) rename Session/{ => Meta}/Images.xcassets/btnRefresh--white.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/btnRefresh--white.imageset/btnRefresh--white.pdf (100%) rename Session/{ => Meta}/Images.xcassets/button_phone_white.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/button_phone_white.imageset/button_phone_white@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/button_phone_white.imageset/button_phone_white@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/button_phone_white.imageset/button_phone_white@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/button_settings_white.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/button_settings_white.imageset/button_settings_white@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/button_settings_white.imageset/button_settings_white@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/button_settings_white.imageset/button_settings_white@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/call-active-wide.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/call-active-wide.imageset/call-active-wide.png (100%) rename Session/{ => Meta}/Images.xcassets/cancel-cross-white.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/cancel-cross-white.imageset/cancel-cross-white@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/cancel-cross-white.imageset/cancel-cross-white@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/cancel-cross-white.imageset/cancel-cross-white@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/cellBtnDelete.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/cellBtnDelete.imageset/cellBtnDelete.pdf (100%) rename Session/{ => Meta}/Images.xcassets/cellBtnMoveToArchive--blue.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/cellBtnMoveToArchive--blue.imageset/cellBtnMoveToArchive--blue.pdf (100%) rename Session/{ => Meta}/Images.xcassets/cellBtnMoveToInbox--blue.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/cellBtnMoveToInbox--blue.imageset/cellBtnMoveToInbox--blue.pdf (100%) rename Session/{ => Meta}/Images.xcassets/compose-cancel.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/compose-cancel.imageset/x-20@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/compose-cancel.imageset/x-20@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/compose-cancel.imageset/x-20@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/contact-avatar-1024.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/contact-avatar-1024.imageset/contact-avatar-1024.png (100%) rename Session/{ => Meta}/Images.xcassets/contact-avatar-84.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/contact-avatar-84.imageset/contact-avatar-84.png (100%) rename Session/{ => Meta}/Images.xcassets/contact-options-action.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/contact-options-action.imageset/contact-options-action.pdf (100%) rename Session/{ => Meta}/Images.xcassets/contact_checkbox_checked.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/contact_checkbox_checked.imageset/checkbox_checked@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/contact_checkbox_checked.imageset/checkbox_checked@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/contact_checkbox_checked.imageset/checkbox_checked@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/contact_checkbox_unchecked.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/contact_checkbox_unchecked.imageset/checkbox_unchecked@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/contact_checkbox_unchecked.imageset/checkbox_unchecked@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/contact_checkbox_unchecked.imageset/checkbox_unchecked@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/contact_view_audio_call.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/contact_view_audio_call.imageset/phone_20@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/contact_view_audio_call.imageset/phone_20@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/contact_view_audio_call.imageset/phone_20@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/contact_view_message.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/contact_view_message.imageset/message_20@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/contact_view_message.imageset/message_20@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/contact_view_message.imageset/message_20@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/contact_view_video_call.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/contact_view_video_call.imageset/video_20@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/contact_view_video_call.imageset/video_20@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/contact_view_video_call.imageset/video_20@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/conversation_settings_search.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/conversation_settings_search.imageset/search-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/conversation_settings_search.imageset/search-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/conversation_settings_search.imageset/search-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_00.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_00.imageset/timer00_12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_00.imageset/timer00_12@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_00.imageset/timer00_12@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_05.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_05.imageset/timer05_12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_05.imageset/timer05_12@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_05.imageset/timer05_12@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_10.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_10.imageset/timer10_12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_10.imageset/timer10_12@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_10.imageset/timer10_12@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_15.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_15.imageset/timer15_12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_15.imageset/timer15_12@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_15.imageset/timer15_12@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_20.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_20.imageset/timer20_12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_20.imageset/timer20_12@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_20.imageset/timer20_12@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_25.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_25.imageset/timer25_12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_25.imageset/timer25_12@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_25.imageset/timer25_12@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_30.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_30.imageset/timer30_12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_30.imageset/timer30_12@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_30.imageset/timer30_12@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_35.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_35.imageset/timer35_12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_35.imageset/timer35_12@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_35.imageset/timer35_12@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_40.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_40.imageset/timer40_12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_40.imageset/timer40_12@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_40.imageset/timer40_12@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_45.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_45.imageset/timer45_12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_45.imageset/timer45_12@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_45.imageset/timer45_12@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_50.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_50.imageset/timer50_12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_50.imageset/timer50_12@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_50.imageset/timer50_12@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_55.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_55.imageset/timer55_12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_55.imageset/timer55_12@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_55.imageset/timer55_12@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_60.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_60.imageset/timer60_12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_60.imageset/timer60_12@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/disappearing_message_60.imageset/timer60_12@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/file-black-40.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/file-black-40.imageset/file-black-40@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/file-black-40.imageset/file-black-40@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/file-black-40.imageset/file-black-40@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/file-icon-large.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/file-icon-large.imageset/file-icon-large@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/file-thin-black-filled-large.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/file-thin-black-filled-large.imageset/file-thin-black-w-shadow-large.png (100%) rename Session/{ => Meta}/Images.xcassets/file-thin-black-large.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/file-thin-black-large.imageset/file-thin-black-large.png (100%) rename Session/{ => Meta}/Images.xcassets/file-white-40.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/file-white-40.imageset/file-white-40@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/file-white-40.imageset/file-white-40@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/file-white-40.imageset/file-white-40@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/generic-attachment-small.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/generic-attachment-small.imageset/generic-attachment-small@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/generic-attachment-small.imageset/generic-attachment-small@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/generic-attachment-small.imageset/generic-attachment-small@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/generic-attachment.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/generic-attachment.imageset/file-light-large@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/generic-attachment.imageset/file-light-large@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/generic-attachment.imageset/file-light-large@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/giphy_logo.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/giphy_logo.imageset/giphy_logo_2@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/giphy_logo.imageset/giphy_logo_2@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/giphy_logo.imageset/giphy_logo_2@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/group-avatar.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/group-avatar.imageset/group-28-white@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/group-avatar.imageset/group-28-white@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/group-avatar.imageset/group-28-white@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/hangup-active-wide.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/hangup-active-wide.imageset/hangup-active-wide.png (100%) rename Session/{ => Meta}/Images.xcassets/home_empty_splash_1.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/home_empty_splash_1.imageset/human-1@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/home_empty_splash_2.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/home_empty_splash_2.imageset/human-2@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/home_empty_splash_3.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/home_empty_splash_3.imageset/human-3@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/home_empty_splash_4.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/home_empty_splash_4.imageset/human-4@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/home_empty_splash_5.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/home_empty_splash_5.imageset/human-5@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_add_caption.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_add_caption.imageset/add-caption-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_add_caption.imageset/add-caption-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_add_caption.imageset/add-caption-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_block.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_block.imageset/ic_block@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_block.imageset/ic_block@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_block.imageset/ic_block@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_broken_link.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_broken_link.imageset/broken-link-16@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_broken_link.imageset/broken-link-16@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_broken_link.imageset/broken-link-16@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_chevron_down.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_chevron_down.imageset/chevron-down-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_chevron_down.imageset/chevron-down-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_chevron_down.imageset/chevron-down-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_chevron_up.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_chevron_up.imageset/chevron-up-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_chevron_up.imageset/chevron-up-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_chevron_up.imageset/chevron-up-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_circled_plus.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_circled_plus.imageset/UIRemoveControlPlus_22x22_@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_circled_plus.imageset/UIRemoveControlPlus_22x22_@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_circled_plus.imageset/UIRemoveControlPlus_22x22_@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_circled_x.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_color_palette.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_color_palette.imageset/color-palette-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_color_palette.imageset/color-palette-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_color_palette.imageset/color-palette-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_copy.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_copy.imageset/Copy-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_copy.imageset/Copy-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_copy.imageset/Copy-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_dark_theme_off.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_dark_theme_off.imageset/dark-theme-off-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_dark_theme_off.imageset/dark-theme-off-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_dark_theme_off.imageset/dark-theme-off-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_dark_theme_on.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_dark_theme_on.imageset/dark-theme-on-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_dark_theme_on.imageset/dark-theme-on-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_dark_theme_on.imageset/dark-theme-on-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_devices_ios.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_devices_ios.imageset/ic_devices_ios.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_devices_ios.imageset/ic_devices_ios@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_devices_ios.imageset/ic_devices_ios@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_download.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_download.imageset/download-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_download.imageset/download-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_download.imageset/download-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_flash_mode_auto.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_flash_mode_auto.imageset/flash-auto-32@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_flash_mode_auto.imageset/flash-auto-32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_flash_mode_auto.imageset/flash-auto-32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_flash_mode_off.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_flash_mode_off.imageset/flash-off-32@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_flash_mode_off.imageset/flash-off-32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_flash_mode_off.imageset/flash-off-32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_flash_mode_on.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_flash_mode_on.imageset/flash-on-32@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_flash_mode_on.imageset/flash-on-32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_flash_mode_on.imageset/flash-on-32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_gallery_badge_gif.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_gallery_badge_gif.imageset/icon_GIF@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_gallery_badge_gif.imageset/icon_GIF@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_gallery_badge_gif.imageset/icon_GIF@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_gallery_badge_video.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_gallery_badge_video.imageset/icon_video@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_gallery_badge_video.imageset/icon_video@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_gallery_badge_video.imageset/icon_video@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_info.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_info.imageset/info-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_info.imageset/info-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_info.imageset/info-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_lock_outline.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_lock_outline.imageset/ic_lock_outline_white.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_lock_outline.imageset/ic_lock_outline_white@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_lock_outline.imageset/ic_lock_outline_white@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_mute_thread.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_mute_thread.imageset/ic_mute_thread@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_mute_thread.imageset/ic_mute_thread@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_mute_thread.imageset/ic_mute_thread@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_plus_24.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_plus_24.imageset/plus-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_plus_24.imageset/plus-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_plus_24.imageset/plus-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_reply.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_reply.imageset/reply-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_reply.imageset/reply-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_reply.imageset/reply-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_secret_sender_indicator.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_speaker_bluetooth_inactive_audio_mode.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_speaker_bluetooth_inactive_audio_mode.imageset/ic_speaker_bluetooth_inactive_audio_mode.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_speaker_bluetooth_inactive_video_mode.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_speaker_bluetooth_inactive_video_mode.imageset/ic_speaker_bluetooth_inactive_video_mode.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_switch_camera.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_switch_camera.imageset/switch-camera-32@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_switch_camera.imageset/switch-camera-32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_switch_camera.imageset/switch-camera-32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_timer.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_timer.imageset/timer-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_timer.imageset/timer-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_timer.imageset/timer-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_timer_disabled.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_timer_disabled.imageset/timer-disabled-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_timer_disabled.imageset/timer-disabled-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_timer_disabled.imageset/timer-disabled-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_trash.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_trash.imageset/trash-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_trash.imageset/trash-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_trash.imageset/trash-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_x_with_shadow.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/ic_x_with_shadow.imageset/x-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_x_with_shadow.imageset/x-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/ic_x_with_shadow.imageset/x-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_brush.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_brush.imageset/marker-32@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_brush.imageset/marker-32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_brush.imageset/marker-32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_caption.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_caption.imageset/caption-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_caption.imageset/caption-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_caption.imageset/caption-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_checkmark_empty.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_checkmark_empty.imageset/checkmark-circle-outline-32@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_checkmark_empty.imageset/checkmark-circle-outline-32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_checkmark_empty.imageset/checkmark-circle-outline-32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_checkmark_full.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_checkmark_full.imageset/checkmark-circle-filled-32@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_checkmark_full.imageset/checkmark-circle-filled-32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_checkmark_full.imageset/checkmark-circle-filled-32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_crop.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_crop.imageset/crop-32@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_crop.imageset/crop-32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_crop.imageset/crop-32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_crop_lock.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_crop_lock.imageset/crop-lock-32@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_crop_lock.imageset/crop-lock-32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_crop_lock.imageset/crop-lock-32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_crop_unlock.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_crop_unlock.imageset/crop-unlock-32@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_crop_unlock.imageset/crop-unlock-32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_crop_unlock.imageset/crop-unlock-32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_flip.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_flip.imageset/flip-32@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_flip.imageset/flip-32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_flip.imageset/flip-32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_rotate.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_rotate.imageset/rotate-32@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_rotate.imageset/rotate-32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_rotate.imageset/rotate-32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_text.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_text.imageset/text-32@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_text.imageset/text-32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_text.imageset/text-32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_undo.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_undo.imageset/undo-32@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_undo.imageset/undo-32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/image_editor_undo.imageset/undo-32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/introducing-link-previews-dark.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/introducing-link-previews-light.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_callkit.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_callkit.imageset/signal-answer.png (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_callkit.imageset/signal-answer@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_callkit.imageset/signal-answer@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_custom_audio.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_custom_audio.imageset/signal-possum-far-wclouds@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_custom_audio.imageset/signal-possum-far-wclouds@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_custom_audio.imageset/signal-possum-far-wclouds@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_profile.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_profile.imageset/introductory_splash_profile.png (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_profile.imageset/introductory_splash_profile@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_profile.imageset/introductory_splash_profile@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_read_receipts.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_read_receipts.imageset/signal-penguin-letter@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_read_receipts.imageset/signal-penguin-letter@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_read_receipts.imageset/signal-penguin-letter@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_video_calling.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_video_calling.imageset/signal-video-splash.png (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_video_calling.imageset/signal-video-splash@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/introductory_splash_video_calling.imageset/signal-video-splash@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/logoSignal.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/logoSignal.imageset/logoSignal.pdf (100%) rename Session/{ => Meta}/Images.xcassets/media_album_caption.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/media_album_caption.imageset/caption-shadow-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/media_album_caption.imageset/caption-shadow-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/media_album_caption.imageset/caption-shadow-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/media_invalid.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/media_invalid.imageset/photo-error-36.png (100%) rename Session/{ => Meta}/Images.xcassets/media_invalid.imageset/photo-error-36@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/media_invalid.imageset/photo-error-36@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/media_retry.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/media_retry.imageset/retry-36.png (100%) rename Session/{ => Meta}/Images.xcassets/media_retry.imageset/retry-36@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/media_retry.imageset/retry-36@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/media_send_batch_mode_disabled.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/media_send_batch_mode_disabled.imageset/create-album-outline-32@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/media_send_batch_mode_disabled.imageset/create-album-outline-32@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/media_send_batch_mode_disabled.imageset/create-album-outline-32@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/message-active-wide.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/message-active-wide.imageset/message-active-wide.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_delivered.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/message_status_delivered.imageset/delivered-18x12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_delivered.imageset/double check@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_delivered.imageset/double check@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_failed.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/message_status_failed.imageset/error-12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_failed.imageset/error-12@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_failed.imageset/error-12@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_failed_large.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/message_status_failed_large.imageset/error-20@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_failed_large.imageset/error-20@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_failed_large.imageset/error-20@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_read.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/message_status_read.imageset/read-18x12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_read.imageset/read-18x12@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_read.imageset/read-18x12@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_sending.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/message_status_sending.imageset/sending@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_sending.imageset/sending@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_sending.imageset/sending@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_sent.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/message_status_sent.imageset/sent-12@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_sent.imageset/sent-12@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/message_status_sent.imageset/sent-12@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/navbar_disclosure_down.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/navbar_disclosure_down.imageset/navbar_disclosure_down_small@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/navbar_disclosure_down.imageset/navbar_disclosure_down_small@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/navbar_disclosure_down.imageset/navbar_disclosure_down_small@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/navbar_disclosure_up.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/navbar_disclosure_up.imageset/navbar_disclosure_up_small@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/navbar_disclosure_up.imageset/navbar_disclosure_up_small@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/navbar_disclosure_up.imageset/navbar_disclosure_up_small@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/note-to-self-avatar.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/note-to-self-avatar.imageset/note-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/note-to-self-avatar.imageset/note-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/note-to-self-avatar.imageset/note-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/onboarding_splash_hero.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/onboarding_splash_hero.imageset/onboarding_splash.png (100%) rename Session/{ => Meta}/Images.xcassets/play_button.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/play_button.imageset/play_button@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/profile_avatar_default.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/profile_avatar_default.imageset/profile_avatar_default@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/profile_avatar_default.imageset/profile_avatar_default@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/profile_avatar_default.imageset/profile_avatar_default@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/quoted-message-cancel.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/quoted-message-cancel.imageset/quoted-message-cancel@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/quoted-message-cancel.imageset/quoted-message-cancel@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/quoted-message-cancel.imageset/quoted-message-cancel@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/searchbar_clear.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/searchbar_clear.imageset/Search-clear_17x17_@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/searchbar_clear.imageset/Search-clear_17x17_@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/searchbar_clear.imageset/Search-clear_17x17_@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/searchbar_search.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/searchbar_search.imageset/UIButtonBarSearch_18x18_@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/searchbar_search.imageset/UIButtonBarSearch_18x18_@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/searchbar_search.imageset/UIButtonBarSearch_18x18_@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/selected_blue_circle.imageset/BlueCheckSelected_31x31_@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/selected_blue_circle.imageset/BlueCheckSelected_31x31_@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/selected_blue_circle.imageset/BlueCheckSelected_31x31_@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/selected_blue_circle.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/settings-avatar-camera-2.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/settings-avatar-camera-2.imageset/camera-filled-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/settings-avatar-camera-2.imageset/camera-filled-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/settings-avatar-camera-2.imageset/camera-filled-24@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/settings-avatar-camera.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/settings-avatar-camera.imageset/settings-avatar-camera@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/settings-avatar-camera.imageset/settings-avatar-camera@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/settings-avatar-camera.imageset/settings-avatar-camera@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/settings.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/settings.imageset/settings.pdf (100%) rename Session/{ => Meta}/Images.xcassets/sliderProgressThumb.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/sliderProgressThumb.imageset/VideoPlayer_Slider_Thumb_15x15_@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/sliderProgressThumb.imageset/VideoPlayer_Slider_Thumb_15x15_@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/sliderProgressThumb.imageset/VideoPlayer_Slider_Thumb_15x15_@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/small_chevron_left.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/small_chevron_left.imageset/chevron_left_16@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/small_chevron_left.imageset/chevron_left_16@3x-1.png (100%) rename Session/{ => Meta}/Images.xcassets/small_chevron_left.imageset/chevron_left_16@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/small_chevron_right.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/small_chevron_right.imageset/chevron_right_16@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/small_chevron_right.imageset/chevron_right_16@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/small_chevron_right.imageset/chevron_right_16@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/statJoinedGroup--blue.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/statJoinedGroup--blue.imageset/statJoinedGroup--blue.pdf (100%) rename Session/{ => Meta}/Images.xcassets/statLeftGroup--blue.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/statLeftGroup--blue.imageset/statLeftGroup--blue.pdf (100%) rename Session/{ => Meta}/Images.xcassets/statRefreshedGroup--blue.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/statRefreshedGroup--blue.imageset/statRefreshedGroup--blue.pdf (100%) rename Session/{ => Meta}/Images.xcassets/system_disclosure_indicator.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/system_disclosure_indicator.imageset/DisclosureIndicator@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_disclosure_indicator.imageset/DisclosureIndicator@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_disclosure_indicator.imageset/DisclosureIndicator@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_disclosure_indicator_rtl.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/system_disclosure_indicator_rtl.imageset/DisclosureIndicatorRTL@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_disclosure_indicator_rtl.imageset/DisclosureIndicatorRTL@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_disclosure_indicator_rtl.imageset/DisclosureIndicatorRTL@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_message_call.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/system_message_call.imageset/system_message_call@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_message_call.imageset/system_message_call@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_message_call.imageset/system_message_call@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_message_disappearing_messages.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/system_message_disappearing_messages.imageset/timer-20@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_message_disappearing_messages.imageset/timer-20@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_message_disappearing_messages.imageset/timer-20@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_message_disappearing_messages_disabled.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/system_message_disappearing_messages_disabled.imageset/timer-disabled-20@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_message_disappearing_messages_disabled.imageset/timer-disabled-20@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_message_disappearing_messages_disabled.imageset/timer-disabled-20@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_message_security.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/system_message_security.imageset/system_message_security@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_message_security.imageset/system_message_security@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_message_security.imageset/system_message_security@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_message_verified.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/system_message_verified.imageset/system_message_verified@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_message_verified.imageset/system_message_verified@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/system_message_verified.imageset/system_message_verified@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_add_to_existing_contact.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_add_to_existing_contact.imageset/table_ic_add_to_existing_contact@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_add_to_existing_contact.imageset/table_ic_add_to_existing_contact@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_add_to_existing_contact.imageset/table_ic_add_to_existing_contact@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_block.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_block.imageset/table_ic_block@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_block.imageset/table_ic_block@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_block.imageset/table_ic_block@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_group_edit.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_group_edit.imageset/table_ic_group_edit@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_group_edit.imageset/table_ic_group_edit@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_group_edit.imageset/table_ic_group_edit@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_group_leave.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_group_leave.imageset/table_ic_group_leave@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_group_leave.imageset/table_ic_group_leave@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_group_leave.imageset/table_ic_group_leave@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_group_members.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_group_members.imageset/table_ic_group_members@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_group_members.imageset/table_ic_group_members@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_group_members.imageset/table_ic_group_members@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_mute_thread.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_mute_thread.imageset/table_ic_mute_thread@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_mute_thread.imageset/table_ic_mute_thread@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_mute_thread.imageset/table_ic_mute_thread@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_new_contact.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_new_contact.imageset/table_ic_new_contact@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_new_contact.imageset/table_ic_new_contact@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_new_contact.imageset/table_ic_new_contact@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_not_verified.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_not_verified.imageset/table_ic_not_verified@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_not_verified.imageset/table_ic_not_verified@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_not_verified.imageset/table_ic_not_verified@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_notification_sound.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_notification_sound.imageset/table_ic_notification_sound@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_notification_sound.imageset/table_ic_notification_sound@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_notification_sound.imageset/table_ic_notification_sound@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_share_profile.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_share_profile.imageset/table_ic_share_profile@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_share_profile.imageset/table_ic_share_profile@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_share_profile.imageset/table_ic_share_profile@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_verify.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_verify.imageset/table_ic_verify@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_verify.imageset/table_ic_verify@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/table_ic_verify.imageset/table_ic_verify@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/twitter_logo.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/twitter_logo.imageset/twitter_logo.pdf (100%) rename Session/{ => Meta}/Images.xcassets/twitter_sharing_image.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/twitter_sharing_image.imageset/logo_with_background.png (100%) rename Session/{ => Meta}/Images.xcassets/twitter_sharing_image.imageset/logo_with_background@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/twitter_sharing_image.imageset/logo_with_background@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/uiEmpty.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/uiEmpty.imageset/uiEmpty.pdf (100%) rename Session/{ => Meta}/Images.xcassets/uiEmptyContact.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/uiEmptyContact.imageset/uiEmptyContact.pdf (100%) rename Session/{ => Meta}/Images.xcassets/video-mute-selected.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/video-mute-selected.imageset/video-mute-selected.png (100%) rename Session/{ => Meta}/Images.xcassets/video-mute-unselected.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/video-mute-unselected.imageset/video-mute-unselected.png (100%) rename Session/{ => Meta}/Images.xcassets/video-switch-camera-unselected.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/video-switch-camera-unselected.imageset/switch_camera_large.png (100%) rename Session/{ => Meta}/Images.xcassets/video-video-selected.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/video-video-selected.imageset/video-video-selected.png (100%) rename Session/{ => Meta}/Images.xcassets/video-video-unselected.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/video-video-unselected.imageset/video-video-unselected.png (100%) rename Session/{ => Meta}/Images.xcassets/voice-memo-button.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/voice-memo-button.imageset/voice-memo-button-32.png (100%) rename Session/{ => Meta}/Images.xcassets/voice-memo-button.imageset/voice-memo-button-64.png (100%) rename Session/{ => Meta}/Images.xcassets/voice-memo-button.imageset/voice-memo-button-96.png (100%) rename Session/{ => Meta}/Images.xcassets/voice-message-large-white.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/voice-message-large-white.imageset/voice-message-large-white@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/voice-message-large-white.imageset/voice-message-large-white@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/voice-message-large-white.imageset/voice-message-large-white@3x.png (100%) rename Session/{ => Meta}/Images.xcassets/x-24.imageset/Contents.json (100%) rename Session/{ => Meta}/Images.xcassets/x-24.imageset/x-24@1x.png (100%) rename Session/{ => Meta}/Images.xcassets/x-24.imageset/x-24@2x.png (100%) rename Session/{ => Meta}/Images.xcassets/x-24.imageset/x-24@3x.png (100%) rename Session/{ => Meta}/Images/audio_pause_button.png (100%) rename Session/{ => Meta}/Images/audio_pause_button@2x.png (100%) rename Session/{ => Meta}/Images/audio_pause_button_blue.png (100%) rename Session/{ => Meta}/Images/audio_pause_button_blue@2x.png (100%) rename Session/{ => Meta}/Images/audio_play_button.png (100%) rename Session/{ => Meta}/Images/audio_play_button@2x.png (100%) rename Session/{ => Meta}/Images/audio_play_button_blue.png (100%) rename Session/{ => Meta}/Images/audio_play_button_blue@2x.png (100%) rename Session/{ => Meta}/Images/call@2x.png (100%) rename Session/{ => Meta}/Images/contact_default_feed.png (100%) rename Session/{ => Meta}/Images/endcall@2x.png (100%) rename Session/{ => Meta}/Images/error_white@2x.png (100%) rename Session/{ => Meta}/Images/mute_off@2x.png (100%) rename Session/{ => Meta}/Images/mute_on@2x.png (100%) rename Session/{ => Meta}/Images/pause_icon.png (100%) rename Session/{ => Meta}/Images/pause_icon@2x.png (100%) rename Session/{ => Meta}/Images/play_icon.png (100%) rename Session/{ => Meta}/Images/play_icon@2x.png (100%) rename Session/{ => Meta}/Images/qr@2x.png (100%) rename Session/{ => Meta}/Images/quit@2x.png (100%) rename Session/{ => Meta}/Images/savephoto@2x.png (100%) rename Session/{ => Meta}/Images/typing-animation-dark.gif (100%) rename Session/{ => Meta}/Images/typing-animation.gif (100%) rename Session/{ => Meta}/Images/warning_white@2x.png (100%) rename {SettingsBundle => Session/Meta}/Settings.bundle/Acknowledgements.plist (100%) rename {SettingsBundle => Session/Meta}/Settings.bundle/Root.plist (100%) rename {SettingsBundle => Session/Meta}/Settings.bundle/en.lproj/Acknowledgements.strings (100%) rename {SettingsBundle => Session/Meta}/Settings.bundle/en.lproj/Root.strings (100%) rename Session/{src => Meta}/Signal-Bridging-Header.h (98%) rename Session/{ => Meta}/Signal-Info.plist (100%) rename Session/{ => Meta}/Signal-Prefix.pch (100%) rename Session/{ => Meta}/Signal.entitlements (100%) rename Session/{ => Meta}/SignalTSan.supp (100%) rename Session/{ => Meta}/SignalUBSan.supp (100%) rename Session/{translations => Meta/Translations}/.tx/config (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/an_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/ar_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/bg_BG_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/ca_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/cs_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/da_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/de_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/es_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/eu_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/fa_IR_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/fa_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/fi_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/fil_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/fr_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/he_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/hu_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/it_IT_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/ja_JP_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/lv_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/nb_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/nl_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/pl_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/pt_BR_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/ro_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/ru_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/sl_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/sq_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/sv_SE_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/ta_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/tr_TR_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/uk_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/zh_CN_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/zh_TW.Big5_translation (100%) rename Session/{translations => Meta/Translations}/.tx/signal-ios.localizablestrings-30/zh_TW_translation (100%) rename Session/{ => Meta/Translations}/Migrating Translations from Android.md (100%) rename Session/{translations => Meta/Translations}/TRANSLATIONS.md (100%) rename Session/{translations => Meta/Translations}/bin/auto-genstrings (100%) rename Session/{translations => Meta/Translations}/bin/pull-translations (100%) rename Session/{translations => Meta/Translations}/bin/push-translation-source (100%) rename Session/{translations => Meta/Translations}/bin/sync-translations (100%) rename Session/{translations => Meta/Translations}/de.lproj/Localizable.strings (100%) rename Session/{translations => Meta/Translations}/en.lproj/Localizable.strings (100%) rename Session/{translations => Meta/Translations}/es.lproj/Localizable.strings (100%) rename Session/{translations => Meta/Translations}/fa.lproj/Localizable.strings (100%) rename Session/{translations => Meta/Translations}/fr.lproj/Localizable.strings (100%) rename Session/{translations => Meta/Translations}/id-ID.lproj/Localizable.strings (100%) rename Session/{translations => Meta/Translations}/it.lproj/Localizable.strings (100%) rename Session/{translations => Meta/Translations}/ja.lproj/Localizable.strings (100%) rename Session/{translations => Meta/Translations}/pl.lproj/Localizable.strings (100%) rename Session/{translations => Meta/Translations}/pt_BR.lproj/Localizable.strings (100%) rename Session/{translations => Meta/Translations}/ru.lproj/Localizable.strings (100%) rename Session/{translations => Meta/Translations}/vi-VN.lproj/Localizable.strings (100%) rename Session/{translations => Meta/Translations}/zh_CN.lproj/Localizable.strings (100%) rename Session/{ => Meta}/main.m (100%) rename Session/{src/util/UI Categories => Signal}/AVAudioSession+OWS.h (100%) rename Session/{src/util/UI Categories => Signal}/AVAudioSession+OWS.m (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/AboutTableViewController.h (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/AboutTableViewController.m (100%) rename Session/{src/Models => Signal}/AccountManager.swift (100%) rename Session/{src/ViewControllers => Signal}/AddContactShareToExistingContactViewController.swift (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/AddToBlockListViewController.h (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/AddToBlockListViewController.m (100%) rename Session/{src/ViewControllers/ThreadSettings => Signal}/AddToGroupViewController.h (100%) rename Session/{src/ViewControllers/ThreadSettings => Signal}/AddToGroupViewController.m (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/AdvancedSettingsTableViewController.h (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/AdvancedSettingsTableViewController.m (100%) rename Session/{src => Signal}/AppDelegate.h (100%) rename Session/{src => Signal}/AppDelegate.m (100%) rename Session/{src/environment => Signal}/AppEnvironment.swift (100%) rename Session/{src/UserInterface/Notifications => Signal}/AppNotifications.swift (100%) rename Session/{src/util => Signal}/AppUpdateNag.swift (100%) rename Session/{src/views => Signal}/AudioProgressView.swift (100%) rename Session/{src/views => Signal}/AvatarTableViewCell.swift (100%) rename Session/{src/ViewControllers => Signal}/AvatarViewHelper.h (100%) rename Session/{src/ViewControllers => Signal}/AvatarViewHelper.m (100%) rename Session/{src/ViewControllers/Registration => Signal}/BackupRestoreViewController.swift (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/BlockListViewController.h (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/BlockListViewController.m (100%) rename Session/{src/call => Signal}/CallAudioService.swift (100%) rename Session/{src/call/Speakerbox => Signal}/CallKitCallManager.swift (100%) rename Session/{src/call/Speakerbox => Signal}/CallKitCallUIAdaptee.swift (100%) rename Session/{src/call => Signal}/CallService.swift (100%) rename Session/{src/call/UserInterface => Signal}/CallUIAdapter.swift (100%) rename Session/{src/ViewControllers/Call => Signal}/CallVideoHintView.swift (98%) rename Session/{src/ViewControllers/Call => Signal}/CallViewController.swift (100%) rename Session/{src/views => Signal}/CaptionView.swift (100%) rename Session/{src/ViewControllers => Signal}/ColorPickerViewController.swift (100%) rename Session/{src/Models => Signal}/CompareSafetyNumbersActivity.swift (100%) rename Session/{src/views => Signal}/ContactCell.swift (100%) rename Session/{src/ViewControllers => Signal}/ContactShareViewHelper.swift (100%) rename Session/{src/ViewControllers => Signal}/ContactViewController.swift (100%) rename Session/{src/ViewControllers => Signal}/ContactsPicker.swift (100%) rename Session/{src/Jobs => Signal}/ConversationConfigurationSyncOperation.swift (100%) rename Session/{src => Signal}/ConversationSearch.swift (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/AttachmentUploadView.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/AttachmentUploadView.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/ConversationMediaView.swift (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/ConversationViewCell.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/ConversationViewCell.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/MediaAlbumCellView.swift (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/MediaDownloadView.swift (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/MediaUploadView.swift (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSBubbleShapeView.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSBubbleShapeView.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSBubbleView.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSBubbleView.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSContactOffersCell.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSContactOffersCell.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSContactShareButtonsView.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSContactShareButtonsView.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSContactShareView.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSContactShareView.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSGenericAttachmentView.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSGenericAttachmentView.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSLabel.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSLabel.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSMessageBubbleView.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSMessageBubbleView.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSMessageCell.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSMessageCell.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSMessageFooterView.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSMessageFooterView.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSMessageHeaderView.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSMessageHeaderView.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSMessageTextView.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSMessageTextView.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSMessageTimerView.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSMessageTimerView.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSQuotedMessageView.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSQuotedMessageView.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSSystemMessageCell.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/OWSSystemMessageCell.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/Cells/TypingIndicatorCell.swift (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationCollectionView.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationCollectionView.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationHeaderView.swift (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationInputTextView.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationInputTextView.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationInputToolbar.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationInputToolbar.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationMessageMapping.swift (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationScrollButton.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationScrollButton.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationViewController.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationViewController.m (99%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationViewItem.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationViewItem.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationViewLayout.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationViewLayout.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationViewModel.h (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/ConversationViewModel.m (100%) rename Session/{src/ViewControllers => Signal}/ConversationView/TypingIndicatorInteraction.swift (100%) rename Session/{src/ViewControllers => Signal}/CropScaleImageViewController.swift (100%) rename Session/{src/util => Signal}/DateUtil.h (100%) rename Session/{src/util => Signal}/DateUtil.m (100%) rename Session/{src/views => Signal}/DismissableTextField.swift (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/DomainFrontingCountryViewController.h (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/DomainFrontingCountryViewController.m (100%) rename Session/{src/environment/ExperienceUpgrades => Signal}/ExperienceUpgrade.swift (100%) rename Session/{src/environment/ExperienceUpgrades => Signal}/ExperienceUpgradeFinder.swift (100%) rename Session/{src/ViewControllers/ThreadSettings => Signal}/FingerprintViewController.h (100%) rename Session/{src/ViewControllers/ThreadSettings => Signal}/FingerprintViewController.m (100%) rename Session/{src/ViewControllers/ThreadSettings => Signal}/FingerprintViewScanController.h (100%) rename Session/{src/ViewControllers/ThreadSettings => Signal}/FingerprintViewScanController.m (100%) rename Session/{src/ViewControllers/GifPicker => Signal}/GifPickerCell.swift (100%) rename Session/{src/ViewControllers/GifPicker => Signal}/GifPickerLayout.swift (100%) rename Session/{src/ViewControllers/GifPicker => Signal}/GifPickerViewController.swift (100%) rename Session/{src/network => Signal}/GiphyAPI.swift (100%) rename Session/{src/network => Signal}/GiphyDownloader.swift (100%) rename Session/{src/views => Signal}/GroupTableViewCell.swift (100%) rename Session/{src/UserInterface => Signal}/HapticFeedback.swift (100%) rename Session/{src/ViewControllers/Photos => Signal}/ImagePickerController.swift (100%) rename Session/{src/ViewControllers => Signal}/InviteFlow.swift (100%) rename Session/{src/util => Signal}/Launch Screen.storyboard (100%) rename Session/{src/UserInterface/Notifications => Signal}/LegacyNotificationsAdaptee.swift (100%) rename Session/{src/views => Signal}/LinkPreviewView.swift (100%) rename Session/{src/ViewControllers => Signal}/LoadingViewController.swift (100%) rename Session/{src/ViewControllers => Signal}/LongTextViewController.swift (100%) rename Session/{src/Storyboard => Signal}/Main.storyboard (100%) rename Session/{src/util => Signal}/MainAppContext.h (100%) rename Session/{src/util => Signal}/MainAppContext.m (100%) rename Session/{src/views => Signal}/MarqueeLabel.swift (100%) rename Session/{src/ViewControllers => Signal}/MediaDetailViewController.h (100%) rename Session/{src/ViewControllers => Signal}/MediaDetailViewController.m (100%) rename Session/{src/ViewControllers => Signal}/MediaGalleryViewController.swift (100%) rename Session/{src/ViewControllers => Signal}/MediaPageViewController.swift (100%) rename Session/{src/ViewControllers => Signal}/MediaTileViewController.swift (100%) rename Session/{src/ViewControllers => Signal}/MenuActionsViewController.swift (100%) rename Session/{src/Models => Signal}/MessageActions.swift (100%) rename Session/{src/ViewControllers => Signal}/MessageDetailViewController.swift (100%) rename Session/{src/Jobs => Signal}/MessageFetcherJob.swift (100%) rename Session/{src/ViewControllers/Utils => Signal}/MessageRecipientStatusUtils.swift (100%) rename Session/{src/views => Signal}/NeverClearView.swift (100%) rename Session/{src/call => Signal}/NonCallKitCallUIAdaptee.swift (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/NotificationSettingsOptionsViewController.h (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/NotificationSettingsOptionsViewController.m (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/NotificationSettingsViewController.h (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/NotificationSettingsViewController.m (100%) rename Session/{src/ViewControllers/ThreadSettings => Signal}/OWSAddToContactViewController.h (100%) rename Session/{src/ViewControllers/ThreadSettings => Signal}/OWSAddToContactViewController.m (100%) rename Session/{src/util => Signal}/OWSAnalytics.swift (100%) rename Session/{src/util/Backup => Signal}/OWSBackup.h (100%) rename Session/{src/util/Backup => Signal}/OWSBackup.m (100%) rename Session/{src/util/Backup => Signal}/OWSBackupAPI.swift (100%) rename Session/{src/util/Backup => Signal}/OWSBackupExportJob.h (100%) rename Session/{src/util/Backup => Signal}/OWSBackupExportJob.m (100%) rename Session/{src/util/Backup => Signal}/OWSBackupIO.h (100%) rename Session/{src/util/Backup => Signal}/OWSBackupIO.m (100%) rename Session/{src/util/Backup => Signal}/OWSBackupImportJob.h (100%) rename Session/{src/util/Backup => Signal}/OWSBackupImportJob.m (100%) rename Session/{src/util/Backup => Signal}/OWSBackupJob.h (100%) rename Session/{src/util/Backup => Signal}/OWSBackupJob.m (100%) rename Session/{src/util/Backup => Signal}/OWSBackupLazyRestore.swift (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/OWSBackupSettingsViewController.h (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/OWSBackupSettingsViewController.m (100%) rename Session/{src/views => Signal}/OWSBezierPathView.h (100%) rename Session/{src/views => Signal}/OWSBezierPathView.m (100%) rename Session/{src/ViewControllers/ThreadSettings => Signal}/OWSConversationSettingsViewController.h (100%) rename Session/{src/ViewControllers/ThreadSettings => Signal}/OWSConversationSettingsViewController.m (100%) rename Session/{src/ViewControllers/ThreadSettings => Signal}/OWSConversationSettingsViewDelegate.h (100%) rename Session/{src/Models => Signal}/OWSDeviceProvisioningURLParser.h (100%) rename Session/{src/Models => Signal}/OWSDeviceProvisioningURLParser.m (100%) rename Session/{src/views => Signal}/OWSDeviceTableViewCell.h (100%) rename Session/{src/views => Signal}/OWSDeviceTableViewCell.m (100%) rename Session/{src/ViewControllers => Signal}/OWSImagePickerController.swift (100%) rename Session/{src/util => Signal}/OWSOrphanDataCleaner.h (100%) rename Session/{src/util => Signal}/OWSOrphanDataCleaner.m (100%) rename Session/{src/views => Signal}/OWSProgressView.h (100%) rename Session/{src/views => Signal}/OWSProgressView.m (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/OWSQRCodeScanningViewController.h (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/OWSQRCodeScanningViewController.m (100%) rename Session/{src/util => Signal}/OWSScreenLockUI.h (100%) rename Session/{src/util => Signal}/OWSScreenLockUI.m (100%) rename Session/{src/Jobs => Signal}/OWSSessionResetJobRecord.h (100%) rename Session/{src/Jobs => Signal}/OWSSessionResetJobRecord.m (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/OWSSoundSettingsViewController.h (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/OWSSoundSettingsViewController.m (100%) rename Session/{src/Generated => Signal}/OWSWebRTCDataProtos.pb.swift (100%) rename Session/{src/ViewControllers/Registration => Signal}/OnboardingCaptchaViewController.swift (100%) rename Session/{src/call => Signal}/OutboundCallInitiator.swift (100%) rename Session/{src/util => Signal}/Pastelog.h (100%) rename Session/{src/util => Signal}/Pastelog.m (100%) rename Session/{src/call => Signal}/PeerConnectionClient.swift (100%) rename Session/{src/ViewControllers/Photos => Signal}/PhotoCapture.swift (100%) rename Session/{src/ViewControllers/Photos => Signal}/PhotoCaptureViewController.swift (100%) rename Session/{src/ViewControllers/Photos => Signal}/PhotoCollectionPickerController.swift (100%) rename Session/{src/views => Signal}/PhotoGridViewCell.swift (100%) rename Session/{src/ViewControllers/Photos => Signal}/PhotoLibrary.swift (100%) rename Session/{src/views => Signal}/PinEntryView.h (100%) rename Session/{src/views => Signal}/PinEntryView.m (100%) rename Session/{src/util => Signal}/Platform.swift (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/PrivacySettingsTableViewController.h (100%) rename Session/{src/ViewControllers/AppSettings => Signal}/PrivacySettingsTableViewController.m (100%) rename Session/{src/environment => Signal}/PushRegistrationManager.swift (100%) rename Session/{src/views => Signal}/QuotedReplyPreview.swift (100%) rename Session/{src/views => Signal}/ReminderView.swift (100%) rename Session/{src/views => Signal}/RemoteVideoView.h (100%) rename Session/{src/views => Signal}/RemoteVideoView.m (100%) rename Session/{src/ViewControllers => Signal}/SafetyNumberConfirmationAlert.swift (100%) rename Session/{src/ViewControllers/Photos => Signal}/SendMediaNavigationController.swift (100%) rename Session/{src/Jobs => Signal}/SessionResetJob.swift (100%) rename Session/{src/ViewControllers/ThreadSettings => Signal}/ShowGroupMembersViewController.h (100%) rename Session/{src/ViewControllers/ThreadSettings => Signal}/ShowGroupMembersViewController.m (100%) rename Session/{src/environment => Signal}/SignalApp.h (100%) rename Session/{src/environment => Signal}/SignalApp.m (100%) rename Session/{src/call => Signal}/SignalCall.swift (100%) rename Session/{src/ViewControllers => Signal}/SignalsNavigationController.h (100%) rename Session/{src/ViewControllers => Signal}/SignalsNavigationController.m (100%) rename Session/{src/Jobs => Signal}/SyncPushTokensJob.swift (100%) rename Session/{src/util => Signal}/TextFieldHelper.swift (100%) rename Session/{src/call => Signal}/TurnServerInfo.swift (100%) rename Session/{src/views => Signal}/TypingIndicatorView.swift (100%) rename Session/{src => Signal}/UIAlerts+iOS9.m (100%) rename Session/{src => Signal}/UIApplication+OWS.swift (100%) rename Session/{src/util/UI Categories => Signal}/UIResponder+OWS.swift (100%) rename Session/{src => Signal}/UIStoryboard+OWS.swift (100%) rename Session/{src/util => Signal}/UIViewController+CameraPermissions.h (100%) rename Session/{src/util => Signal}/UIViewController+Permissions.h (100%) rename Session/{src/util => Signal}/UIViewController+Permissions.m (100%) rename Session/{src/ViewControllers/ThreadSettings => Signal}/UpdateGroupViewController.h (100%) rename Session/{src/ViewControllers/ThreadSettings => Signal}/UpdateGroupViewController.m (100%) rename Session/{src/UserInterface/Notifications => Signal}/UserNotificationsAdaptee.swift (100%) rename Session/{src/views => Signal}/VoiceNoteLock.swift (100%) rename Session/{src/call => Signal}/WebRTCCallMessageHandler.swift (100%) rename Session/{src/Generated => Signal}/WebRTCProto.swift (100%) rename Session/{src/Loki => }/Utilities/AppearanceUtilities.swift (100%) rename Session/{src/Loki => }/Utilities/AudioUtilities.swift (100%) rename Session/{src/Loki => }/Utilities/BackgroundPoller.swift (100%) rename Session/{src/Loki => }/Utilities/CGRect+Utilities.swift (100%) rename Session/{src/Loki => }/Utilities/ContactUtilities.swift (100%) rename Session/{src/Loki => }/Utilities/IP2Country.swift (100%) rename Session/{src/Loki => }/Utilities/KeyPairGeneration.swift (100%) rename Session/{src/Loki => }/Utilities/KeyPairUtilities.swift (100%) rename Session/{src/Loki => }/Utilities/MentionUtilities.swift (100%) rename Session/{src/Loki => }/Utilities/QRCode.swift (100%) rename Session/{src/Loki => }/Utilities/Sodium+Conversion.swift (100%) rename Session/{src/Loki => }/Utilities/UIImage+Scaling.swift (100%) rename Session/{src/Loki => }/Utilities/UILabel+Interaction.swift (100%) rename Session/{src/Loki => }/Utilities/UIView+Glow.swift (100%) rename Session/{src/Loki => }/Utilities/UIView+Wrapping.swift (100%) rename Session/{src/Loki => }/View Controllers/BaseVC.swift (100%) rename Session/{src/Loki => }/View Controllers/DeviceLinkingModal.swift (100%) rename Session/{src/Loki => }/View Controllers/DeviceLinkingModalDelegate.swift (100%) rename Session/{src/Loki => }/View Controllers/DeviceLinksVC.swift (100%) rename Session/{src/Loki => }/View Controllers/DeviceNameModal.swift (100%) rename Session/{src/Loki => }/View Controllers/DeviceNameModalDelegate.swift (100%) rename Session/{src/Loki => }/View Controllers/DisplayNameVC.swift (100%) rename Session/{src/Loki => }/View Controllers/EditClosedGroupVC.swift (100%) rename Session/{src/Loki => }/View Controllers/GroupMembersVC.swift (100%) rename Session/{src/Loki => }/View Controllers/HomeVC.swift (100%) rename Session/{src/Loki => }/View Controllers/JoinPublicChatVC.swift (100%) rename Session/{src/Loki => }/View Controllers/LandingVC.swift (100%) rename Session/{src/Loki => }/View Controllers/LightModeSheet.swift (100%) rename Session/{src/Loki => }/View Controllers/LinkDeviceVC.swift (100%) rename Session/{src/Loki => }/View Controllers/LinkDeviceVCDelegate.swift (100%) rename Session/{src/Loki => }/View Controllers/Modal.swift (100%) rename Session/{src/Loki => }/View Controllers/MultiDeviceRemovalSheet.swift (100%) rename Session/{src/Loki => }/View Controllers/NewClosedGroupVC.swift (100%) rename Session/{src/Loki => }/View Controllers/NewPrivateChatVC.swift (100%) rename Session/{src/Loki => }/View Controllers/NukeDataModal.swift (100%) rename Session/{src/Loki => }/View Controllers/OpenGroupSuggestionSheet.swift (100%) rename Session/{src/Loki => }/View Controllers/PNModeVC.swift (100%) rename Session/{src/Loki => }/View Controllers/PathVC.swift (100%) rename Session/{src/Loki => }/View Controllers/QRCodeVC.swift (100%) rename Session/{src/Loki => }/View Controllers/RegisterVC.swift (100%) rename Session/{src/Loki => }/View Controllers/RestoreVC.swift (100%) rename Session/{src/Loki => }/View Controllers/ScanQRCodeWrapperVC.swift (100%) rename Session/{src/Loki => }/View Controllers/SeedModal.swift (100%) rename Session/{src/Loki => }/View Controllers/SeedVC.swift (100%) rename Session/{src/Loki => }/View Controllers/SettingsVC.swift (100%) rename Session/{src/Loki => }/View Controllers/Sheet.swift (100%) rename Session/{src/Loki => }/View Controllers/UserSelectionVC.swift (100%) delete mode 100644 Session/iTunesArtwork@3x.png delete mode 100644 Session/src/UserInterface/OWSLayerView.swift delete mode 100644 Session/src/ViewControllers/DebugSettingsTableViewController.m delete mode 100644 Session/src/ViewControllers/DebugUI/DebugContactsUtils.h delete mode 100644 Session/src/ViewControllers/DebugUI/DebugContactsUtils.m delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIBackup.h delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIBackup.m delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUICalling.swift delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIContacts.h delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIContacts.m delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIDiskUsage.h delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIDiskUsage.m delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIFileBrowser.swift delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIMessages.h delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIMessages.m delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIMessagesAction.h delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIMessagesAction.m delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIMessagesAssetLoader.h delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIMessagesAssetLoader.m delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIMessagesUtils.h delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIMisc.h delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIMisc.m delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUINotifications.swift delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIPage.h delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIPage.m delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIProfile.swift delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUISessionState.h delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUISessionState.m delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIStress.h delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUIStress.m delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUISyncMessages.h delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUISyncMessages.m delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUITableViewController.h delete mode 100644 Session/src/ViewControllers/DebugUI/DebugUITableViewController.m delete mode 100644 Session/test/Assets/test-gif.gif delete mode 100644 Session/test/Assets/test-jpg.JPG delete mode 100644 Session/test/Assets/test-mp3.mp3 delete mode 100644 Session/test/Assets/test-mp4.mp4 delete mode 100644 Session/test/Models/MantlePerfTest.swift delete mode 100644 Session/test/Models/OWSDeviceProvisioningURLParserTest.m delete mode 100644 Session/test/SSKTests/ParamParserTest.swift delete mode 100644 Session/test/SSKTests/SSKProtoEnvelopeTest.swift delete mode 100644 Session/test/SignalBaseTest.h delete mode 100644 Session/test/SignalBaseTest.m delete mode 100644 Session/test/SignalTests-Bridging-Header.h delete mode 100644 Session/test/Supporting Files/SignalTests-Info.plist delete mode 100644 Session/test/Supporting Files/whisperFake.cer delete mode 100644 Session/test/TestUtil.h delete mode 100644 Session/test/ViewControllers/ConversationViewItemTest.m delete mode 100644 Session/test/call/PeerConnectionClientTest.swift delete mode 100644 Session/test/mocks/MockEnvironment.h delete mode 100644 Session/test/mocks/MockEnvironment.m delete mode 100644 Session/test/util/ByteParserTest.swift delete mode 100644 Session/test/util/CDSSigningCertificateTest.m delete mode 100644 Session/test/util/DisplayableTextFilterTest.swift delete mode 100644 Session/test/util/ExceptionsTest.h delete mode 100644 Session/test/util/FunctionalUtilTest.m delete mode 100644 Session/test/util/ImageCacheTest.swift delete mode 100644 Session/test/util/OWSDatabaseConverterTest.m delete mode 100644 Session/test/util/OWSOrphanDataCleanerTest.m delete mode 100644 Session/test/util/OWSScrubbingLogFormatterTest.m delete mode 100644 Session/test/util/ProtoParsingTest.m delete mode 100644 Session/test/util/SearcherTest.swift delete mode 100644 Session/test/util/StringAdditionsTest.swift delete mode 100644 Session/test/util/TSStorageIdentityKeyStoreTests.m delete mode 100644 Session/test/util/TSStoragePreKeyStoreTests.m delete mode 100644 Session/test/util/TSStorageSignedPreKeyStore.m delete mode 100644 Session/test/util/UtilTest.h delete mode 100644 Session/test/util/UtilTest.m delete mode 100644 Session/test/views/ImageEditor/ImageEditorModelTest.swift delete mode 100644 Session/test/views/ImageEditor/ImageEditorTest.swift diff --git a/Session/src/Loki/Components/ConversationCell.swift b/Session/Components/ConversationCell.swift similarity index 100% rename from Session/src/Loki/Components/ConversationCell.swift rename to Session/Components/ConversationCell.swift diff --git a/Session/src/Loki/Components/ConversationTitleView.swift b/Session/Components/ConversationTitleView.swift similarity index 100% rename from Session/src/Loki/Components/ConversationTitleView.swift rename to Session/Components/ConversationTitleView.swift diff --git a/Session/src/Loki/Components/FakeChatView.swift b/Session/Components/FakeChatView.swift similarity index 100% rename from Session/src/Loki/Components/FakeChatView.swift rename to Session/Components/FakeChatView.swift diff --git a/Session/src/Loki/Components/MentionCandidateSelectionView.swift b/Session/Components/MentionCandidateSelectionView.swift similarity index 100% rename from Session/src/Loki/Components/MentionCandidateSelectionView.swift rename to Session/Components/MentionCandidateSelectionView.swift diff --git a/Session/src/Loki/Components/NewConversationButtonSet.swift b/Session/Components/NewConversationButtonSet.swift similarity index 100% rename from Session/src/Loki/Components/NewConversationButtonSet.swift rename to Session/Components/NewConversationButtonSet.swift diff --git a/Session/src/Loki/Components/PNOptionView.swift b/Session/Components/PNOptionView.swift similarity index 100% rename from Session/src/Loki/Components/PNOptionView.swift rename to Session/Components/PNOptionView.swift diff --git a/Session/src/Loki/Components/PathStatusView.swift b/Session/Components/PathStatusView.swift similarity index 100% rename from Session/src/Loki/Components/PathStatusView.swift rename to Session/Components/PathStatusView.swift diff --git a/Session/src/Loki/Components/SeedReminderView.swift b/Session/Components/SeedReminderView.swift similarity index 100% rename from Session/src/Loki/Components/SeedReminderView.swift rename to Session/Components/SeedReminderView.swift diff --git a/Session/src/Loki/Components/SessionRestorationView.swift b/Session/Components/SessionRestorationView.swift similarity index 100% rename from Session/src/Loki/Components/SessionRestorationView.swift rename to Session/Components/SessionRestorationView.swift diff --git a/Session/src/Loki/Components/UserCell.swift b/Session/Components/UserCell.swift similarity index 100% rename from Session/src/Loki/Components/UserCell.swift rename to Session/Components/UserCell.swift diff --git a/Session/src/Loki/Components/VoiceMessageView.swift b/Session/Components/VoiceMessageView.swift similarity index 100% rename from Session/src/Loki/Components/VoiceMessageView.swift rename to Session/Components/VoiceMessageView.swift diff --git a/Session/src/Loki/Database/Storage+VolumeSamples.swift b/Session/Database/Storage+VolumeSamples.swift similarity index 100% rename from Session/src/Loki/Database/Storage+VolumeSamples.swift rename to Session/Database/Storage+VolumeSamples.swift diff --git a/Session/src/Loki/Dependencies/SRCopyableLabel.swift b/Session/Dependencies/SRCopyableLabel.swift similarity index 100% rename from Session/src/Loki/Dependencies/SRCopyableLabel.swift rename to Session/Dependencies/SRCopyableLabel.swift diff --git a/Session/src/Loki/Dependencies/SwiftCSV/CSV.swift b/Session/Dependencies/SwiftCSV/CSV.swift similarity index 100% rename from Session/src/Loki/Dependencies/SwiftCSV/CSV.swift rename to Session/Dependencies/SwiftCSV/CSV.swift diff --git a/Session/src/Loki/Dependencies/SwiftCSV/Description.swift b/Session/Dependencies/SwiftCSV/Description.swift similarity index 100% rename from Session/src/Loki/Dependencies/SwiftCSV/Description.swift rename to Session/Dependencies/SwiftCSV/Description.swift diff --git a/Session/src/Loki/Dependencies/SwiftCSV/EnumeratedView.swift b/Session/Dependencies/SwiftCSV/EnumeratedView.swift similarity index 100% rename from Session/src/Loki/Dependencies/SwiftCSV/EnumeratedView.swift rename to Session/Dependencies/SwiftCSV/EnumeratedView.swift diff --git a/Session/src/Loki/Dependencies/SwiftCSV/NamedView.swift b/Session/Dependencies/SwiftCSV/NamedView.swift similarity index 100% rename from Session/src/Loki/Dependencies/SwiftCSV/NamedView.swift rename to Session/Dependencies/SwiftCSV/NamedView.swift diff --git a/Session/src/Loki/Dependencies/SwiftCSV/Parser.swift b/Session/Dependencies/SwiftCSV/Parser.swift similarity index 100% rename from Session/src/Loki/Dependencies/SwiftCSV/Parser.swift rename to Session/Dependencies/SwiftCSV/Parser.swift diff --git a/Session/src/Loki/Dependencies/SwiftCSV/ParsingState.swift b/Session/Dependencies/SwiftCSV/ParsingState.swift similarity index 100% rename from Session/src/Loki/Dependencies/SwiftCSV/ParsingState.swift rename to Session/Dependencies/SwiftCSV/ParsingState.swift diff --git a/Session/src/Loki/Dependencies/SwiftCSV/String+Lines.swift b/Session/Dependencies/SwiftCSV/String+Lines.swift similarity index 100% rename from Session/src/Loki/Dependencies/SwiftCSV/String+Lines.swift rename to Session/Dependencies/SwiftCSV/String+Lines.swift diff --git a/Session/AudioFiles/NewMessage.aifc b/Session/Meta/AudioFiles/NewMessage.aifc similarity index 100% rename from Session/AudioFiles/NewMessage.aifc rename to Session/Meta/AudioFiles/NewMessage.aifc diff --git a/Session/AudioFiles/busy_tone_ansi.caf b/Session/Meta/AudioFiles/busy_tone_ansi.caf similarity index 100% rename from Session/AudioFiles/busy_tone_ansi.caf rename to Session/Meta/AudioFiles/busy_tone_ansi.caf diff --git a/Session/AudioFiles/end_call_tone_cept.caf b/Session/Meta/AudioFiles/end_call_tone_cept.caf similarity index 100% rename from Session/AudioFiles/end_call_tone_cept.caf rename to Session/Meta/AudioFiles/end_call_tone_cept.caf diff --git a/Session/AudioFiles/messageReceivedSounds/aurora-quiet.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/aurora-quiet.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/aurora-quiet.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/aurora-quiet.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/aurora.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/aurora.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/aurora.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/aurora.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/bamboo-quiet.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/bamboo-quiet.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/bamboo-quiet.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/bamboo-quiet.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/bamboo.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/bamboo.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/bamboo.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/bamboo.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/chord-quiet.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/chord-quiet.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/chord-quiet.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/chord-quiet.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/chord.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/chord.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/chord.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/chord.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/circles-quiet.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/circles-quiet.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/circles-quiet.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/circles-quiet.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/circles.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/circles.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/circles.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/circles.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/classic-quiet.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/classic-quiet.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/classic-quiet.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/classic-quiet.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/classic.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/classic.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/classic.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/classic.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/complete-quiet.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/complete-quiet.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/complete-quiet.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/complete-quiet.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/complete.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/complete.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/complete.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/complete.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/hello-quiet.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/hello-quiet.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/hello-quiet.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/hello-quiet.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/hello.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/hello.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/hello.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/hello.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/input-quiet.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/input-quiet.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/input-quiet.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/input-quiet.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/input.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/input.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/input.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/input.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/keys-quiet.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/keys-quiet.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/keys-quiet.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/keys-quiet.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/keys.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/keys.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/keys.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/keys.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/make-quiet.sh b/Session/Meta/AudioFiles/messageReceivedSounds/make-quiet.sh similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/make-quiet.sh rename to Session/Meta/AudioFiles/messageReceivedSounds/make-quiet.sh diff --git a/Session/AudioFiles/messageReceivedSounds/note-quiet.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/note-quiet.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/note-quiet.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/note-quiet.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/note.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/note.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/note.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/note.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/popcorn-quiet.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/popcorn-quiet.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/popcorn-quiet.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/popcorn-quiet.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/popcorn.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/popcorn.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/popcorn.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/popcorn.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/pulse-quiet.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/pulse-quiet.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/pulse-quiet.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/pulse-quiet.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/pulse.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/pulse.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/pulse.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/pulse.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/synth-quiet.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/synth-quiet.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/synth-quiet.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/synth-quiet.aifc diff --git a/Session/AudioFiles/messageReceivedSounds/synth.aifc b/Session/Meta/AudioFiles/messageReceivedSounds/synth.aifc similarity index 100% rename from Session/AudioFiles/messageReceivedSounds/synth.aifc rename to Session/Meta/AudioFiles/messageReceivedSounds/synth.aifc diff --git a/Session/AudioFiles/message_sent.aiff b/Session/Meta/AudioFiles/message_sent.aiff similarity index 100% rename from Session/AudioFiles/message_sent.aiff rename to Session/Meta/AudioFiles/message_sent.aiff diff --git a/Session/AudioFiles/ringback_tone_ansi.caf b/Session/Meta/AudioFiles/ringback_tone_ansi.caf similarity index 100% rename from Session/AudioFiles/ringback_tone_ansi.caf rename to Session/Meta/AudioFiles/ringback_tone_ansi.caf diff --git a/Session/AudioFiles/ringtoneSounds/Opening.m4r b/Session/Meta/AudioFiles/ringtoneSounds/Opening.m4r similarity index 100% rename from Session/AudioFiles/ringtoneSounds/Opening.m4r rename to Session/Meta/AudioFiles/ringtoneSounds/Opening.m4r diff --git a/Session/AudioFiles/sonarping.mp3 b/Session/Meta/AudioFiles/sonarping.mp3 similarity index 100% rename from Session/AudioFiles/sonarping.mp3 rename to Session/Meta/AudioFiles/sonarping.mp3 diff --git a/Session/CSV/GeoLite2-Country-Blocks-IPv4.csv b/Session/Meta/CSV/GeoLite2-Country-Blocks-IPv4.csv similarity index 100% rename from Session/CSV/GeoLite2-Country-Blocks-IPv4.csv rename to Session/Meta/CSV/GeoLite2-Country-Blocks-IPv4.csv diff --git a/Session/CSV/GeoLite2-Country-Locations-English.csv b/Session/Meta/CSV/GeoLite2-Country-Locations-English.csv similarity index 100% rename from Session/CSV/GeoLite2-Country-Locations-English.csv rename to Session/Meta/CSV/GeoLite2-Country-Locations-English.csv diff --git a/Session/Fonts/ElegantIcons.ttf b/Session/Meta/Fonts/ElegantIcons.ttf similarity index 100% rename from Session/Fonts/ElegantIcons.ttf rename to Session/Meta/Fonts/ElegantIcons.ttf diff --git a/Session/SpaceMono-Bold.ttf b/Session/Meta/Fonts/SpaceMono-Bold.ttf similarity index 100% rename from Session/SpaceMono-Bold.ttf rename to Session/Meta/Fonts/SpaceMono-Bold.ttf diff --git a/Session/Fonts/Loki/SpaceMono-Regular.ttf b/Session/Meta/Fonts/SpaceMono-Regular.ttf similarity index 100% rename from Session/Fonts/Loki/SpaceMono-Regular.ttf rename to Session/Meta/Fonts/SpaceMono-Regular.ttf diff --git a/Session/Fonts/dripicons-v2.ttf b/Session/Meta/Fonts/dripicons-v2.ttf similarity index 100% rename from Session/Fonts/dripicons-v2.ttf rename to Session/Meta/Fonts/dripicons-v2.ttf diff --git a/Session/Fonts/fontawesome-webfont.ttf b/Session/Meta/Fonts/fontawesome-webfont.ttf similarity index 100% rename from Session/Fonts/fontawesome-webfont.ttf rename to Session/Meta/Fonts/fontawesome-webfont.ttf diff --git a/Session/Images.xcassets/AppIcon.appiconset/Contents.json b/Session/Meta/Images.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Contents.json rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Contents.json diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-1024.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-1024.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-1024.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-1024.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-120.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-120.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-120.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-120.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-121.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-121.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-121.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-121.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-152.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-152.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-152.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-152.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-167.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-167.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-167.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-167.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-180.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-180.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-180.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-180.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-20.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-20.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-20.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-20.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-29.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-29.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-29.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-29.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-30.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-30.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-30.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-30.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-40.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-40.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-40.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-40.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-41.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-41.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-41.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-41.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-42.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-42.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-42.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-42.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-58.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-58.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-58.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-58.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-59.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-59.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-59.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-59.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-60.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-60.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-60.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-60.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-76.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-76.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-76.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-76.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-80.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-80.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-80.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-80.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-81.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-81.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-81.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-81.png diff --git a/Session/Images.xcassets/AppIcon.appiconset/Icon-87.png b/Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-87.png similarity index 100% rename from Session/Images.xcassets/AppIcon.appiconset/Icon-87.png rename to Session/Meta/Images.xcassets/AppIcon.appiconset/Icon-87.png diff --git a/Session/Images.xcassets/Contents.json b/Session/Meta/Images.xcassets/Contents.json similarity index 100% rename from Session/Images.xcassets/Contents.json rename to Session/Meta/Images.xcassets/Contents.json diff --git a/Session/Images.xcassets/Loki V2/AddPerson.imageset/AddPerson.pdf b/Session/Meta/Images.xcassets/Loki V2/AddPerson.imageset/AddPerson.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/AddPerson.imageset/AddPerson.pdf rename to Session/Meta/Images.xcassets/Loki V2/AddPerson.imageset/AddPerson.pdf diff --git a/Session/Images.xcassets/Loki V2/AddPerson.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/AddPerson.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/AddPerson.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/AddPerson.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/ArrowUpDarkMode.imageset/ArrowUp.pdf b/Session/Meta/Images.xcassets/Loki V2/ArrowUpDarkMode.imageset/ArrowUp.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/ArrowUpDarkMode.imageset/ArrowUp.pdf rename to Session/Meta/Images.xcassets/Loki V2/ArrowUpDarkMode.imageset/ArrowUp.pdf diff --git a/Session/Images.xcassets/Loki V2/ArrowUpDarkMode.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/ArrowUpDarkMode.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/ArrowUpDarkMode.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/ArrowUpDarkMode.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/ArrowUpLightMode.imageset/ArrowUpLightMode.pdf b/Session/Meta/Images.xcassets/Loki V2/ArrowUpLightMode.imageset/ArrowUpLightMode.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/ArrowUpLightMode.imageset/ArrowUpLightMode.pdf rename to Session/Meta/Images.xcassets/Loki V2/ArrowUpLightMode.imageset/ArrowUpLightMode.pdf diff --git a/Session/Images.xcassets/Loki V2/ArrowUpLightMode.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/ArrowUpLightMode.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/ArrowUpLightMode.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/ArrowUpLightMode.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/ChatBubbles.imageset/ChatBubbles.pdf b/Session/Meta/Images.xcassets/Loki V2/ChatBubbles.imageset/ChatBubbles.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/ChatBubbles.imageset/ChatBubbles.pdf rename to Session/Meta/Images.xcassets/Loki V2/ChatBubbles.imageset/ChatBubbles.pdf diff --git a/Session/Images.xcassets/Loki V2/ChatBubbles.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/ChatBubbles.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/ChatBubbles.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/ChatBubbles.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/Check.imageset/Check.pdf b/Session/Meta/Images.xcassets/Loki V2/Check.imageset/Check.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/Check.imageset/Check.pdf rename to Session/Meta/Images.xcassets/Loki V2/Check.imageset/Check.pdf diff --git a/Session/Images.xcassets/Loki V2/Check.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/Check.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/Check.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/Check.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/Circle.imageset/Circle.pdf b/Session/Meta/Images.xcassets/Loki V2/Circle.imageset/Circle.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/Circle.imageset/Circle.pdf rename to Session/Meta/Images.xcassets/Loki V2/Circle.imageset/Circle.pdf diff --git a/Session/Images.xcassets/Loki V2/Circle.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/Circle.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/Circle.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/Circle.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/CircleCheck.imageset/CircleCheck.pdf b/Session/Meta/Images.xcassets/Loki V2/CircleCheck.imageset/CircleCheck.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/CircleCheck.imageset/CircleCheck.pdf rename to Session/Meta/Images.xcassets/Loki V2/CircleCheck.imageset/CircleCheck.pdf diff --git a/Session/Images.xcassets/Loki V2/CircleCheck.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/CircleCheck.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/CircleCheck.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/CircleCheck.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/CircleDotDotDot.imageset/CircleDotDotDot.pdf b/Session/Meta/Images.xcassets/Loki V2/CircleDotDotDot.imageset/CircleDotDotDot.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/CircleDotDotDot.imageset/CircleDotDotDot.pdf rename to Session/Meta/Images.xcassets/Loki V2/CircleDotDotDot.imageset/CircleDotDotDot.pdf diff --git a/Session/Images.xcassets/Loki V2/CircleDotDotDot.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/CircleDotDotDot.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/CircleDotDotDot.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/CircleDotDotDot.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/CirclePause.imageset/CirclePause.pdf b/Session/Meta/Images.xcassets/Loki V2/CirclePause.imageset/CirclePause.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/CirclePause.imageset/CirclePause.pdf rename to Session/Meta/Images.xcassets/Loki V2/CirclePause.imageset/CirclePause.pdf diff --git a/Session/Images.xcassets/Loki V2/CirclePause.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/CirclePause.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/CirclePause.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/CirclePause.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/CirclePlay.imageset/CirclePlay.pdf b/Session/Meta/Images.xcassets/Loki V2/CirclePlay.imageset/CirclePlay.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/CirclePlay.imageset/CirclePlay.pdf rename to Session/Meta/Images.xcassets/Loki V2/CirclePlay.imageset/CirclePlay.pdf diff --git a/Session/Images.xcassets/Loki V2/CirclePlay.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/CirclePlay.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/CirclePlay.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/CirclePlay.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/CirclePlus.imageset/CirclePlus.pdf b/Session/Meta/Images.xcassets/Loki V2/CirclePlus.imageset/CirclePlus.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/CirclePlus.imageset/CirclePlus.pdf rename to Session/Meta/Images.xcassets/Loki V2/CirclePlus.imageset/CirclePlus.pdf diff --git a/Session/Images.xcassets/Loki V2/CirclePlus.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/CirclePlus.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/CirclePlus.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/CirclePlus.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/Contents.json b/Session/Meta/Images.xcassets/Loki V2/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/Contents.json diff --git a/Session/Images.xcassets/Loki V2/FilledCircleCheckDarkMode.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/FilledCircleCheckDarkMode.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/FilledCircleCheckDarkMode.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/FilledCircleCheckDarkMode.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/FilledCircleCheckDarkMode.imageset/FilledCircleCheckDarkMode.pdf b/Session/Meta/Images.xcassets/Loki V2/FilledCircleCheckDarkMode.imageset/FilledCircleCheckDarkMode.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/FilledCircleCheckDarkMode.imageset/FilledCircleCheckDarkMode.pdf rename to Session/Meta/Images.xcassets/Loki V2/FilledCircleCheckDarkMode.imageset/FilledCircleCheckDarkMode.pdf diff --git a/Session/Images.xcassets/Loki V2/FilledCircleCheckLightMode.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/FilledCircleCheckLightMode.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/FilledCircleCheckLightMode.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/FilledCircleCheckLightMode.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/FilledCircleCheckLightMode.imageset/FilledCircleCheckLightMode.pdf b/Session/Meta/Images.xcassets/Loki V2/FilledCircleCheckLightMode.imageset/FilledCircleCheckLightMode.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/FilledCircleCheckLightMode.imageset/FilledCircleCheckLightMode.pdf rename to Session/Meta/Images.xcassets/Loki V2/FilledCircleCheckLightMode.imageset/FilledCircleCheckLightMode.pdf diff --git a/Session/Images.xcassets/Loki V2/Flag.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/Flag.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/Flag.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/Flag.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/Flag.imageset/Flag.pdf b/Session/Meta/Images.xcassets/Loki V2/Flag.imageset/Flag.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/Flag.imageset/Flag.pdf rename to Session/Meta/Images.xcassets/Loki V2/Flag.imageset/Flag.pdf diff --git a/Session/Images.xcassets/Loki V2/Gear.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/Gear.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/Gear.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/Gear.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/Gear.imageset/Gear.pdf b/Session/Meta/Images.xcassets/Loki V2/Gear.imageset/Gear.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/Gear.imageset/Gear.pdf rename to Session/Meta/Images.xcassets/Loki V2/Gear.imageset/Gear.pdf diff --git a/Session/Images.xcassets/Loki V2/Globe.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/Globe.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/Globe.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/Globe.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/Globe.imageset/Globe.pdf b/Session/Meta/Images.xcassets/Loki V2/Globe.imageset/Globe.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/Globe.imageset/Globe.pdf rename to Session/Meta/Images.xcassets/Loki V2/Globe.imageset/Globe.pdf diff --git a/Session/Images.xcassets/Loki V2/Group.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/Group.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/Group.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/Group.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/Group.imageset/Group.pdf b/Session/Meta/Images.xcassets/Loki V2/Group.imageset/Group.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/Group.imageset/Group.pdf rename to Session/Meta/Images.xcassets/Loki V2/Group.imageset/Group.pdf diff --git a/Session/Images.xcassets/Loki V2/Key.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/Key.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/Key.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/Key.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/Key.imageset/Key.pdf b/Session/Meta/Images.xcassets/Loki V2/Key.imageset/Key.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/Key.imageset/Key.pdf rename to Session/Meta/Images.xcassets/Loki V2/Key.imageset/Key.pdf diff --git a/Session/Images.xcassets/Loki V2/MagnifyingGlass.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/MagnifyingGlass.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/MagnifyingGlass.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/MagnifyingGlass.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/MagnifyingGlass.imageset/MagnifyingGlass.pdf b/Session/Meta/Images.xcassets/Loki V2/MagnifyingGlass.imageset/MagnifyingGlass.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/MagnifyingGlass.imageset/MagnifyingGlass.pdf rename to Session/Meta/Images.xcassets/Loki V2/MagnifyingGlass.imageset/MagnifyingGlass.pdf diff --git a/Session/Images.xcassets/Loki V2/Message.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/Message.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/Message.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/Message.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/Message.imageset/Message.pdf b/Session/Meta/Images.xcassets/Loki V2/Message.imageset/Message.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/Message.imageset/Message.pdf rename to Session/Meta/Images.xcassets/Loki V2/Message.imageset/Message.pdf diff --git a/Session/Images.xcassets/Loki V2/Microphone.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/Microphone.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/Microphone.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/Microphone.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/Microphone.imageset/Microphone.pdf b/Session/Meta/Images.xcassets/Loki V2/Microphone.imageset/Microphone.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/Microphone.imageset/Microphone.pdf rename to Session/Meta/Images.xcassets/Loki V2/Microphone.imageset/Microphone.pdf diff --git a/Session/Images.xcassets/Loki V2/Mute.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/Mute.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/Mute.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/Mute.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/Mute.imageset/Mute.pdf b/Session/Meta/Images.xcassets/Loki V2/Mute.imageset/Mute.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/Mute.imageset/Mute.pdf rename to Session/Meta/Images.xcassets/Loki V2/Mute.imageset/Mute.pdf diff --git a/Session/Images.xcassets/Loki V2/Pause.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/Pause.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/Pause.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/Pause.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/Pause.imageset/Pause.pdf b/Session/Meta/Images.xcassets/Loki V2/Pause.imageset/Pause.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/Pause.imageset/Pause.pdf rename to Session/Meta/Images.xcassets/Loki V2/Pause.imageset/Pause.pdf diff --git a/Session/Images.xcassets/Loki V2/People.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/People.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/People.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/People.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/People.imageset/People.pdf b/Session/Meta/Images.xcassets/Loki V2/People.imageset/People.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/People.imageset/People.pdf rename to Session/Meta/Images.xcassets/Loki V2/People.imageset/People.pdf diff --git a/Session/Images.xcassets/Loki V2/Play.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/Play.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/Play.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/Play.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/Play.imageset/Play.pdf b/Session/Meta/Images.xcassets/Loki V2/Play.imageset/Play.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/Play.imageset/Play.pdf rename to Session/Meta/Images.xcassets/Loki V2/Play.imageset/Play.pdf diff --git a/Session/Images.xcassets/Loki V2/Plus.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/Plus.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/Plus.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/Plus.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/Plus.imageset/Plus.pdf b/Session/Meta/Images.xcassets/Loki V2/Plus.imageset/Plus.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/Plus.imageset/Plus.pdf rename to Session/Meta/Images.xcassets/Loki V2/Plus.imageset/Plus.pdf diff --git a/Session/Images.xcassets/Loki V2/QRCode.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/QRCode.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/QRCode.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/QRCode.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/QRCode.imageset/QRCodeFilled.pdf b/Session/Meta/Images.xcassets/Loki V2/QRCode.imageset/QRCodeFilled.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/QRCode.imageset/QRCodeFilled.pdf rename to Session/Meta/Images.xcassets/Loki V2/QRCode.imageset/QRCodeFilled.pdf diff --git a/Session/Images.xcassets/Loki V2/QuestionMark.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/QuestionMark.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/QuestionMark.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/QuestionMark.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/QuestionMark.imageset/QuestionMark.pdf b/Session/Meta/Images.xcassets/Loki V2/QuestionMark.imageset/QuestionMark.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/QuestionMark.imageset/QuestionMark.pdf rename to Session/Meta/Images.xcassets/Loki V2/QuestionMark.imageset/QuestionMark.pdf diff --git a/Session/Images.xcassets/Loki V2/SessionGreen32.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/SessionGreen32.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionGreen32.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/SessionGreen32.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/SessionGreen32.imageset/SessionGreen32.png b/Session/Meta/Images.xcassets/Loki V2/SessionGreen32.imageset/SessionGreen32.png similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionGreen32.imageset/SessionGreen32.png rename to Session/Meta/Images.xcassets/Loki V2/SessionGreen32.imageset/SessionGreen32.png diff --git a/Session/Images.xcassets/Loki V2/SessionGreen32.imageset/SessionGreen32@2x.png b/Session/Meta/Images.xcassets/Loki V2/SessionGreen32.imageset/SessionGreen32@2x.png similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionGreen32.imageset/SessionGreen32@2x.png rename to Session/Meta/Images.xcassets/Loki V2/SessionGreen32.imageset/SessionGreen32@2x.png diff --git a/Session/Images.xcassets/Loki V2/SessionGreen32.imageset/SessionGreen32@3x.png b/Session/Meta/Images.xcassets/Loki V2/SessionGreen32.imageset/SessionGreen32@3x.png similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionGreen32.imageset/SessionGreen32@3x.png rename to Session/Meta/Images.xcassets/Loki V2/SessionGreen32.imageset/SessionGreen32@3x.png diff --git a/Session/Images.xcassets/Loki V2/SessionGreen64.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/SessionGreen64.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionGreen64.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/SessionGreen64.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/SessionGreen64.imageset/SessionGreen64.png b/Session/Meta/Images.xcassets/Loki V2/SessionGreen64.imageset/SessionGreen64.png similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionGreen64.imageset/SessionGreen64.png rename to Session/Meta/Images.xcassets/Loki V2/SessionGreen64.imageset/SessionGreen64.png diff --git a/Session/Images.xcassets/Loki V2/SessionGreen64.imageset/SessionGreen64@2x.png b/Session/Meta/Images.xcassets/Loki V2/SessionGreen64.imageset/SessionGreen64@2x.png similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionGreen64.imageset/SessionGreen64@2x.png rename to Session/Meta/Images.xcassets/Loki V2/SessionGreen64.imageset/SessionGreen64@2x.png diff --git a/Session/Images.xcassets/Loki V2/SessionGreen64.imageset/SessionGreen64@3x.png b/Session/Meta/Images.xcassets/Loki V2/SessionGreen64.imageset/SessionGreen64@3x.png similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionGreen64.imageset/SessionGreen64@3x.png rename to Session/Meta/Images.xcassets/Loki V2/SessionGreen64.imageset/SessionGreen64@3x.png diff --git a/Session/Images.xcassets/Loki V2/SessionWhite16.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/SessionWhite16.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionWhite16.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/SessionWhite16.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/SessionWhite16.imageset/SessionWhite16.png b/Session/Meta/Images.xcassets/Loki V2/SessionWhite16.imageset/SessionWhite16.png similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionWhite16.imageset/SessionWhite16.png rename to Session/Meta/Images.xcassets/Loki V2/SessionWhite16.imageset/SessionWhite16.png diff --git a/Session/Images.xcassets/Loki V2/SessionWhite16.imageset/SessionWhite16@2x.png b/Session/Meta/Images.xcassets/Loki V2/SessionWhite16.imageset/SessionWhite16@2x.png similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionWhite16.imageset/SessionWhite16@2x.png rename to Session/Meta/Images.xcassets/Loki V2/SessionWhite16.imageset/SessionWhite16@2x.png diff --git a/Session/Images.xcassets/Loki V2/SessionWhite16.imageset/SessionWhite16@3x.png b/Session/Meta/Images.xcassets/Loki V2/SessionWhite16.imageset/SessionWhite16@3x.png similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionWhite16.imageset/SessionWhite16@3x.png rename to Session/Meta/Images.xcassets/Loki V2/SessionWhite16.imageset/SessionWhite16@3x.png diff --git a/Session/Images.xcassets/Loki V2/SessionWhite24.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/SessionWhite24.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionWhite24.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/SessionWhite24.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/SessionWhite24.imageset/SessionWhite24.png b/Session/Meta/Images.xcassets/Loki V2/SessionWhite24.imageset/SessionWhite24.png similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionWhite24.imageset/SessionWhite24.png rename to Session/Meta/Images.xcassets/Loki V2/SessionWhite24.imageset/SessionWhite24.png diff --git a/Session/Images.xcassets/Loki V2/SessionWhite24.imageset/SessionWhite24@2x.png b/Session/Meta/Images.xcassets/Loki V2/SessionWhite24.imageset/SessionWhite24@2x.png similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionWhite24.imageset/SessionWhite24@2x.png rename to Session/Meta/Images.xcassets/Loki V2/SessionWhite24.imageset/SessionWhite24@2x.png diff --git a/Session/Images.xcassets/Loki V2/SessionWhite24.imageset/SessionWhite24@3x.png b/Session/Meta/Images.xcassets/Loki V2/SessionWhite24.imageset/SessionWhite24@3x.png similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionWhite24.imageset/SessionWhite24@3x.png rename to Session/Meta/Images.xcassets/Loki V2/SessionWhite24.imageset/SessionWhite24@3x.png diff --git a/Session/Images.xcassets/Loki V2/SessionWhite40.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/SessionWhite40.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionWhite40.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/SessionWhite40.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/SessionWhite40.imageset/SessionWhite40.png b/Session/Meta/Images.xcassets/Loki V2/SessionWhite40.imageset/SessionWhite40.png similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionWhite40.imageset/SessionWhite40.png rename to Session/Meta/Images.xcassets/Loki V2/SessionWhite40.imageset/SessionWhite40.png diff --git a/Session/Images.xcassets/Loki V2/SessionWhite40.imageset/SessionWhite40@2x.png b/Session/Meta/Images.xcassets/Loki V2/SessionWhite40.imageset/SessionWhite40@2x.png similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionWhite40.imageset/SessionWhite40@2x.png rename to Session/Meta/Images.xcassets/Loki V2/SessionWhite40.imageset/SessionWhite40@2x.png diff --git a/Session/Images.xcassets/Loki V2/SessionWhite40.imageset/SessionWhite40@3x.png b/Session/Meta/Images.xcassets/Loki V2/SessionWhite40.imageset/SessionWhite40@3x.png similarity index 100% rename from Session/Images.xcassets/Loki V2/SessionWhite40.imageset/SessionWhite40@3x.png rename to Session/Meta/Images.xcassets/Loki V2/SessionWhite40.imageset/SessionWhite40@3x.png diff --git a/Session/Images.xcassets/Loki V2/Star.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/Star.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/Star.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/Star.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/Star.imageset/StarOutline.pdf b/Session/Meta/Images.xcassets/Loki V2/Star.imageset/StarOutline.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/Star.imageset/StarOutline.pdf rename to Session/Meta/Images.xcassets/Loki V2/Star.imageset/StarOutline.pdf diff --git a/Session/Images.xcassets/Loki V2/Sun.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/Sun.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/Sun.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/Sun.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/Sun.imageset/Sun.pdf b/Session/Meta/Images.xcassets/Loki V2/Sun.imageset/Sun.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/Sun.imageset/Sun.pdf rename to Session/Meta/Images.xcassets/Loki V2/Sun.imageset/Sun.pdf diff --git a/Session/Images.xcassets/Loki V2/X.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki V2/X.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki V2/X.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki V2/X.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki V2/X.imageset/X.pdf b/Session/Meta/Images.xcassets/Loki V2/X.imageset/X.pdf similarity index 100% rename from Session/Images.xcassets/Loki V2/X.imageset/X.pdf rename to Session/Meta/Images.xcassets/Loki V2/X.imageset/X.pdf diff --git a/Session/Images.xcassets/Loki/Cog.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki/Cog.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki/Cog.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki/Cog.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki/Cog.imageset/pow.png b/Session/Meta/Images.xcassets/Loki/Cog.imageset/pow.png similarity index 100% rename from Session/Images.xcassets/Loki/Cog.imageset/pow.png rename to Session/Meta/Images.xcassets/Loki/Cog.imageset/pow.png diff --git a/Session/Images.xcassets/Loki/Cog.imageset/pow@2x.png b/Session/Meta/Images.xcassets/Loki/Cog.imageset/pow@2x.png similarity index 100% rename from Session/Images.xcassets/Loki/Cog.imageset/pow@2x.png rename to Session/Meta/Images.xcassets/Loki/Cog.imageset/pow@2x.png diff --git a/Session/Images.xcassets/Loki/Cog.imageset/pow@3x.png b/Session/Meta/Images.xcassets/Loki/Cog.imageset/pow@3x.png similarity index 100% rename from Session/Images.xcassets/Loki/Cog.imageset/pow@3x.png rename to Session/Meta/Images.xcassets/Loki/Cog.imageset/pow@3x.png diff --git a/Session/Images.xcassets/Loki/Contents.json b/Session/Meta/Images.xcassets/Loki/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki/Contents.json rename to Session/Meta/Images.xcassets/Loki/Contents.json diff --git a/Session/Images.xcassets/Loki/Crown.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki/Crown.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki/Crown.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki/Crown.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki/Crown.imageset/crown.pdf b/Session/Meta/Images.xcassets/Loki/Crown.imageset/crown.pdf similarity index 100% rename from Session/Images.xcassets/Loki/Crown.imageset/crown.pdf rename to Session/Meta/Images.xcassets/Loki/Crown.imageset/crown.pdf diff --git a/Session/Images.xcassets/Loki/Loki.imageset/Contents.json b/Session/Meta/Images.xcassets/Loki/Loki.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/Loki/Loki.imageset/Contents.json rename to Session/Meta/Images.xcassets/Loki/Loki.imageset/Contents.json diff --git a/Session/Images.xcassets/Loki/Loki.imageset/Loki_Logo_Icon_White.pdf b/Session/Meta/Images.xcassets/Loki/Loki.imageset/Loki_Logo_Icon_White.pdf similarity index 100% rename from Session/Images.xcassets/Loki/Loki.imageset/Loki_Logo_Icon_White.pdf rename to Session/Meta/Images.xcassets/Loki/Loki.imageset/Loki_Logo_Icon_White.pdf diff --git a/Session/Images.xcassets/NavBarBack.imageset/Contents.json b/Session/Meta/Images.xcassets/NavBarBack.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/NavBarBack.imageset/Contents.json rename to Session/Meta/Images.xcassets/NavBarBack.imageset/Contents.json diff --git a/Session/Images.xcassets/NavBarBack.imageset/NavBarBackWhite@1x.png b/Session/Meta/Images.xcassets/NavBarBack.imageset/NavBarBackWhite@1x.png similarity index 100% rename from Session/Images.xcassets/NavBarBack.imageset/NavBarBackWhite@1x.png rename to Session/Meta/Images.xcassets/NavBarBack.imageset/NavBarBackWhite@1x.png diff --git a/Session/Images.xcassets/NavBarBack.imageset/NavBarBackWhite@2x.png b/Session/Meta/Images.xcassets/NavBarBack.imageset/NavBarBackWhite@2x.png similarity index 100% rename from Session/Images.xcassets/NavBarBack.imageset/NavBarBackWhite@2x.png rename to Session/Meta/Images.xcassets/NavBarBack.imageset/NavBarBackWhite@2x.png diff --git a/Session/Images.xcassets/NavBarBack.imageset/NavBarBackWhite@3x.png b/Session/Meta/Images.xcassets/NavBarBack.imageset/NavBarBackWhite@3x.png similarity index 100% rename from Session/Images.xcassets/NavBarBack.imageset/NavBarBackWhite@3x.png rename to Session/Meta/Images.xcassets/NavBarBack.imageset/NavBarBackWhite@3x.png diff --git a/Session/Images.xcassets/NavBarBackRTL.imageset/Contents.json b/Session/Meta/Images.xcassets/NavBarBackRTL.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/NavBarBackRTL.imageset/Contents.json rename to Session/Meta/Images.xcassets/NavBarBackRTL.imageset/Contents.json diff --git a/Session/Images.xcassets/NavBarBackRTL.imageset/NavBarBackWhiteRTL@1x.png b/Session/Meta/Images.xcassets/NavBarBackRTL.imageset/NavBarBackWhiteRTL@1x.png similarity index 100% rename from Session/Images.xcassets/NavBarBackRTL.imageset/NavBarBackWhiteRTL@1x.png rename to Session/Meta/Images.xcassets/NavBarBackRTL.imageset/NavBarBackWhiteRTL@1x.png diff --git a/Session/Images.xcassets/NavBarBackRTL.imageset/NavBarBackWhiteRTL@2x.png b/Session/Meta/Images.xcassets/NavBarBackRTL.imageset/NavBarBackWhiteRTL@2x.png similarity index 100% rename from Session/Images.xcassets/NavBarBackRTL.imageset/NavBarBackWhiteRTL@2x.png rename to Session/Meta/Images.xcassets/NavBarBackRTL.imageset/NavBarBackWhiteRTL@2x.png diff --git a/Session/Images.xcassets/NavBarBackRTL.imageset/NavBarBackWhiteRTL@3x.png b/Session/Meta/Images.xcassets/NavBarBackRTL.imageset/NavBarBackWhiteRTL@3x.png similarity index 100% rename from Session/Images.xcassets/NavBarBackRTL.imageset/NavBarBackWhiteRTL@3x.png rename to Session/Meta/Images.xcassets/NavBarBackRTL.imageset/NavBarBackWhiteRTL@3x.png diff --git a/Session/Images.xcassets/NavBarBackWithShadow.imageset/Contents.json b/Session/Meta/Images.xcassets/NavBarBackWithShadow.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/NavBarBackWithShadow.imageset/Contents.json rename to Session/Meta/Images.xcassets/NavBarBackWithShadow.imageset/Contents.json diff --git a/Session/Images.xcassets/NavBarBackWithShadow.imageset/chevron-left-shadow-24@1x.png b/Session/Meta/Images.xcassets/NavBarBackWithShadow.imageset/chevron-left-shadow-24@1x.png similarity index 100% rename from Session/Images.xcassets/NavBarBackWithShadow.imageset/chevron-left-shadow-24@1x.png rename to Session/Meta/Images.xcassets/NavBarBackWithShadow.imageset/chevron-left-shadow-24@1x.png diff --git a/Session/Images.xcassets/NavBarBackWithShadow.imageset/chevron-left-shadow-24@2x.png b/Session/Meta/Images.xcassets/NavBarBackWithShadow.imageset/chevron-left-shadow-24@2x.png similarity index 100% rename from Session/Images.xcassets/NavBarBackWithShadow.imageset/chevron-left-shadow-24@2x.png rename to Session/Meta/Images.xcassets/NavBarBackWithShadow.imageset/chevron-left-shadow-24@2x.png diff --git a/Session/Images.xcassets/NavBarBackWithShadow.imageset/chevron-left-shadow-24@3x.png b/Session/Meta/Images.xcassets/NavBarBackWithShadow.imageset/chevron-left-shadow-24@3x.png similarity index 100% rename from Session/Images.xcassets/NavBarBackWithShadow.imageset/chevron-left-shadow-24@3x.png rename to Session/Meta/Images.xcassets/NavBarBackWithShadow.imageset/chevron-left-shadow-24@3x.png diff --git a/Session/Images.xcassets/NavBarBackWithShadowRTL.imageset/Contents.json b/Session/Meta/Images.xcassets/NavBarBackWithShadowRTL.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/NavBarBackWithShadowRTL.imageset/Contents.json rename to Session/Meta/Images.xcassets/NavBarBackWithShadowRTL.imageset/Contents.json diff --git a/Session/Images.xcassets/NavBarBackWithShadowRTL.imageset/chevron-right-shadow-24@1x.png b/Session/Meta/Images.xcassets/NavBarBackWithShadowRTL.imageset/chevron-right-shadow-24@1x.png similarity index 100% rename from Session/Images.xcassets/NavBarBackWithShadowRTL.imageset/chevron-right-shadow-24@1x.png rename to Session/Meta/Images.xcassets/NavBarBackWithShadowRTL.imageset/chevron-right-shadow-24@1x.png diff --git a/Session/Images.xcassets/NavBarBackWithShadowRTL.imageset/chevron-right-shadow-24@2x.png b/Session/Meta/Images.xcassets/NavBarBackWithShadowRTL.imageset/chevron-right-shadow-24@2x.png similarity index 100% rename from Session/Images.xcassets/NavBarBackWithShadowRTL.imageset/chevron-right-shadow-24@2x.png rename to Session/Meta/Images.xcassets/NavBarBackWithShadowRTL.imageset/chevron-right-shadow-24@2x.png diff --git a/Session/Images.xcassets/NavBarBackWithShadowRTL.imageset/chevron-right-shadow-24@3x.png b/Session/Meta/Images.xcassets/NavBarBackWithShadowRTL.imageset/chevron-right-shadow-24@3x.png similarity index 100% rename from Session/Images.xcassets/NavBarBackWithShadowRTL.imageset/chevron-right-shadow-24@3x.png rename to Session/Meta/Images.xcassets/NavBarBackWithShadowRTL.imageset/chevron-right-shadow-24@3x.png diff --git a/Session/Images.xcassets/_arrow_button.imageset/Contents.json b/Session/Meta/Images.xcassets/_arrow_button.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/_arrow_button.imageset/Contents.json rename to Session/Meta/Images.xcassets/_arrow_button.imageset/Contents.json diff --git a/Session/Images.xcassets/_arrow_button.imageset/btnBack--white.pdf b/Session/Meta/Images.xcassets/_arrow_button.imageset/btnBack--white.pdf similarity index 100% rename from Session/Images.xcassets/_arrow_button.imageset/btnBack--white.pdf rename to Session/Meta/Images.xcassets/_arrow_button.imageset/btnBack--white.pdf diff --git a/Session/Images.xcassets/actionsheet_camera_black.imageset/Contents.json b/Session/Meta/Images.xcassets/actionsheet_camera_black.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/actionsheet_camera_black.imageset/Contents.json rename to Session/Meta/Images.xcassets/actionsheet_camera_black.imageset/Contents.json diff --git a/Session/Images.xcassets/actionsheet_camera_black.imageset/actionsheet_camera_black@1x.png b/Session/Meta/Images.xcassets/actionsheet_camera_black.imageset/actionsheet_camera_black@1x.png similarity index 100% rename from Session/Images.xcassets/actionsheet_camera_black.imageset/actionsheet_camera_black@1x.png rename to Session/Meta/Images.xcassets/actionsheet_camera_black.imageset/actionsheet_camera_black@1x.png diff --git a/Session/Images.xcassets/actionsheet_camera_black.imageset/actionsheet_camera_black@2x.png b/Session/Meta/Images.xcassets/actionsheet_camera_black.imageset/actionsheet_camera_black@2x.png similarity index 100% rename from Session/Images.xcassets/actionsheet_camera_black.imageset/actionsheet_camera_black@2x.png rename to Session/Meta/Images.xcassets/actionsheet_camera_black.imageset/actionsheet_camera_black@2x.png diff --git a/Session/Images.xcassets/actionsheet_camera_black.imageset/actionsheet_camera_black@3x.png b/Session/Meta/Images.xcassets/actionsheet_camera_black.imageset/actionsheet_camera_black@3x.png similarity index 100% rename from Session/Images.xcassets/actionsheet_camera_black.imageset/actionsheet_camera_black@3x.png rename to Session/Meta/Images.xcassets/actionsheet_camera_black.imageset/actionsheet_camera_black@3x.png diff --git a/Session/Images.xcassets/actionsheet_camera_roll_black.imageset/Contents.json b/Session/Meta/Images.xcassets/actionsheet_camera_roll_black.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/actionsheet_camera_roll_black.imageset/Contents.json rename to Session/Meta/Images.xcassets/actionsheet_camera_roll_black.imageset/Contents.json diff --git a/Session/Images.xcassets/actionsheet_camera_roll_black.imageset/actionsheet_camera_roll_black@1x.png b/Session/Meta/Images.xcassets/actionsheet_camera_roll_black.imageset/actionsheet_camera_roll_black@1x.png similarity index 100% rename from Session/Images.xcassets/actionsheet_camera_roll_black.imageset/actionsheet_camera_roll_black@1x.png rename to Session/Meta/Images.xcassets/actionsheet_camera_roll_black.imageset/actionsheet_camera_roll_black@1x.png diff --git a/Session/Images.xcassets/actionsheet_camera_roll_black.imageset/actionsheet_camera_roll_black@2x.png b/Session/Meta/Images.xcassets/actionsheet_camera_roll_black.imageset/actionsheet_camera_roll_black@2x.png similarity index 100% rename from Session/Images.xcassets/actionsheet_camera_roll_black.imageset/actionsheet_camera_roll_black@2x.png rename to Session/Meta/Images.xcassets/actionsheet_camera_roll_black.imageset/actionsheet_camera_roll_black@2x.png diff --git a/Session/Images.xcassets/actionsheet_camera_roll_black.imageset/actionsheet_camera_roll_black@3x.png b/Session/Meta/Images.xcassets/actionsheet_camera_roll_black.imageset/actionsheet_camera_roll_black@3x.png similarity index 100% rename from Session/Images.xcassets/actionsheet_camera_roll_black.imageset/actionsheet_camera_roll_black@3x.png rename to Session/Meta/Images.xcassets/actionsheet_camera_roll_black.imageset/actionsheet_camera_roll_black@3x.png diff --git a/Session/Images.xcassets/actionsheet_contact.imageset/Contents.json b/Session/Meta/Images.xcassets/actionsheet_contact.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/actionsheet_contact.imageset/Contents.json rename to Session/Meta/Images.xcassets/actionsheet_contact.imageset/Contents.json diff --git a/Session/Images.xcassets/actionsheet_contact.imageset/person_outline_24@1x.png b/Session/Meta/Images.xcassets/actionsheet_contact.imageset/person_outline_24@1x.png similarity index 100% rename from Session/Images.xcassets/actionsheet_contact.imageset/person_outline_24@1x.png rename to Session/Meta/Images.xcassets/actionsheet_contact.imageset/person_outline_24@1x.png diff --git a/Session/Images.xcassets/actionsheet_contact.imageset/person_outline_24@2x.png b/Session/Meta/Images.xcassets/actionsheet_contact.imageset/person_outline_24@2x.png similarity index 100% rename from Session/Images.xcassets/actionsheet_contact.imageset/person_outline_24@2x.png rename to Session/Meta/Images.xcassets/actionsheet_contact.imageset/person_outline_24@2x.png diff --git a/Session/Images.xcassets/actionsheet_contact.imageset/person_outline_24@3x.png b/Session/Meta/Images.xcassets/actionsheet_contact.imageset/person_outline_24@3x.png similarity index 100% rename from Session/Images.xcassets/actionsheet_contact.imageset/person_outline_24@3x.png rename to Session/Meta/Images.xcassets/actionsheet_contact.imageset/person_outline_24@3x.png diff --git a/Session/Images.xcassets/actionsheet_document_black.imageset/Contents.json b/Session/Meta/Images.xcassets/actionsheet_document_black.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/actionsheet_document_black.imageset/Contents.json rename to Session/Meta/Images.xcassets/actionsheet_document_black.imageset/Contents.json diff --git a/Session/Images.xcassets/actionsheet_document_black.imageset/actionsheet_document_black@1x.png b/Session/Meta/Images.xcassets/actionsheet_document_black.imageset/actionsheet_document_black@1x.png similarity index 100% rename from Session/Images.xcassets/actionsheet_document_black.imageset/actionsheet_document_black@1x.png rename to Session/Meta/Images.xcassets/actionsheet_document_black.imageset/actionsheet_document_black@1x.png diff --git a/Session/Images.xcassets/actionsheet_document_black.imageset/actionsheet_document_black@2x.png b/Session/Meta/Images.xcassets/actionsheet_document_black.imageset/actionsheet_document_black@2x.png similarity index 100% rename from Session/Images.xcassets/actionsheet_document_black.imageset/actionsheet_document_black@2x.png rename to Session/Meta/Images.xcassets/actionsheet_document_black.imageset/actionsheet_document_black@2x.png diff --git a/Session/Images.xcassets/actionsheet_document_black.imageset/actionsheet_document_black@3x.png b/Session/Meta/Images.xcassets/actionsheet_document_black.imageset/actionsheet_document_black@3x.png similarity index 100% rename from Session/Images.xcassets/actionsheet_document_black.imageset/actionsheet_document_black@3x.png rename to Session/Meta/Images.xcassets/actionsheet_document_black.imageset/actionsheet_document_black@3x.png diff --git a/Session/Images.xcassets/actionsheet_gif_black.imageset/Contents.json b/Session/Meta/Images.xcassets/actionsheet_gif_black.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/actionsheet_gif_black.imageset/Contents.json rename to Session/Meta/Images.xcassets/actionsheet_gif_black.imageset/Contents.json diff --git a/Session/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@1x.png b/Session/Meta/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@1x.png similarity index 100% rename from Session/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@1x.png rename to Session/Meta/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@1x.png diff --git a/Session/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@2x.png b/Session/Meta/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@2x.png similarity index 100% rename from Session/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@2x.png rename to Session/Meta/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@2x.png diff --git a/Session/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@3x.png b/Session/Meta/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@3x.png similarity index 100% rename from Session/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@3x.png rename to Session/Meta/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@3x.png diff --git a/Session/Images.xcassets/add-conversation.imageset/Contents.json b/Session/Meta/Images.xcassets/add-conversation.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/add-conversation.imageset/Contents.json rename to Session/Meta/Images.xcassets/add-conversation.imageset/Contents.json diff --git a/Session/Images.xcassets/add-conversation.imageset/add_conversation.pdf b/Session/Meta/Images.xcassets/add-conversation.imageset/add_conversation.pdf similarity index 100% rename from Session/Images.xcassets/add-conversation.imageset/add_conversation.pdf rename to Session/Meta/Images.xcassets/add-conversation.imageset/add_conversation.pdf diff --git a/Session/Images.xcassets/album_add_more.imageset/Contents.json b/Session/Meta/Images.xcassets/album_add_more.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/album_add_more.imageset/Contents.json rename to Session/Meta/Images.xcassets/album_add_more.imageset/Contents.json diff --git a/Session/Images.xcassets/album_add_more.imageset/create-album-outline-32@1x.png b/Session/Meta/Images.xcassets/album_add_more.imageset/create-album-outline-32@1x.png similarity index 100% rename from Session/Images.xcassets/album_add_more.imageset/create-album-outline-32@1x.png rename to Session/Meta/Images.xcassets/album_add_more.imageset/create-album-outline-32@1x.png diff --git a/Session/Images.xcassets/album_add_more.imageset/create-album-outline-32@2x.png b/Session/Meta/Images.xcassets/album_add_more.imageset/create-album-outline-32@2x.png similarity index 100% rename from Session/Images.xcassets/album_add_more.imageset/create-album-outline-32@2x.png rename to Session/Meta/Images.xcassets/album_add_more.imageset/create-album-outline-32@2x.png diff --git a/Session/Images.xcassets/album_add_more.imageset/create-album-outline-32@3x.png b/Session/Meta/Images.xcassets/album_add_more.imageset/create-album-outline-32@3x.png similarity index 100% rename from Session/Images.xcassets/album_add_more.imageset/create-album-outline-32@3x.png rename to Session/Meta/Images.xcassets/album_add_more.imageset/create-album-outline-32@3x.png diff --git a/Session/Images.xcassets/attachment_audio.imageset/Contents.json b/Session/Meta/Images.xcassets/attachment_audio.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/attachment_audio.imageset/Contents.json rename to Session/Meta/Images.xcassets/attachment_audio.imageset/Contents.json diff --git a/Session/Images.xcassets/attachment_audio.imageset/attachment_audio@1x.png b/Session/Meta/Images.xcassets/attachment_audio.imageset/attachment_audio@1x.png similarity index 100% rename from Session/Images.xcassets/attachment_audio.imageset/attachment_audio@1x.png rename to Session/Meta/Images.xcassets/attachment_audio.imageset/attachment_audio@1x.png diff --git a/Session/Images.xcassets/attachment_audio.imageset/attachment_audio@2x.png b/Session/Meta/Images.xcassets/attachment_audio.imageset/attachment_audio@2x.png similarity index 100% rename from Session/Images.xcassets/attachment_audio.imageset/attachment_audio@2x.png rename to Session/Meta/Images.xcassets/attachment_audio.imageset/attachment_audio@2x.png diff --git a/Session/Images.xcassets/attachment_audio.imageset/attachment_audio@3x.png b/Session/Meta/Images.xcassets/attachment_audio.imageset/attachment_audio@3x.png similarity index 100% rename from Session/Images.xcassets/attachment_audio.imageset/attachment_audio@3x.png rename to Session/Meta/Images.xcassets/attachment_audio.imageset/attachment_audio@3x.png diff --git a/Session/Images.xcassets/attachment_file.imageset/Contents.json b/Session/Meta/Images.xcassets/attachment_file.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/attachment_file.imageset/Contents.json rename to Session/Meta/Images.xcassets/attachment_file.imageset/Contents.json diff --git a/Session/Images.xcassets/attachment_file.imageset/attachment_file@1x.png b/Session/Meta/Images.xcassets/attachment_file.imageset/attachment_file@1x.png similarity index 100% rename from Session/Images.xcassets/attachment_file.imageset/attachment_file@1x.png rename to Session/Meta/Images.xcassets/attachment_file.imageset/attachment_file@1x.png diff --git a/Session/Images.xcassets/attachment_file.imageset/attachment_file@2x.png b/Session/Meta/Images.xcassets/attachment_file.imageset/attachment_file@2x.png similarity index 100% rename from Session/Images.xcassets/attachment_file.imageset/attachment_file@2x.png rename to Session/Meta/Images.xcassets/attachment_file.imageset/attachment_file@2x.png diff --git a/Session/Images.xcassets/attachment_file.imageset/attachment_file@3x.png b/Session/Meta/Images.xcassets/attachment_file.imageset/attachment_file@3x.png similarity index 100% rename from Session/Images.xcassets/attachment_file.imageset/attachment_file@3x.png rename to Session/Meta/Images.xcassets/attachment_file.imageset/attachment_file@3x.png diff --git a/Session/Images.xcassets/attachment_play_button.imageset/Contents.json b/Session/Meta/Images.xcassets/attachment_play_button.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/attachment_play_button.imageset/Contents.json rename to Session/Meta/Images.xcassets/attachment_play_button.imageset/Contents.json diff --git a/Session/Images.xcassets/attachment_play_button.imageset/attachment_play_button@1x.png b/Session/Meta/Images.xcassets/attachment_play_button.imageset/attachment_play_button@1x.png similarity index 100% rename from Session/Images.xcassets/attachment_play_button.imageset/attachment_play_button@1x.png rename to Session/Meta/Images.xcassets/attachment_play_button.imageset/attachment_play_button@1x.png diff --git a/Session/Images.xcassets/attachment_play_button.imageset/attachment_play_button@2x.png b/Session/Meta/Images.xcassets/attachment_play_button.imageset/attachment_play_button@2x.png similarity index 100% rename from Session/Images.xcassets/attachment_play_button.imageset/attachment_play_button@2x.png rename to Session/Meta/Images.xcassets/attachment_play_button.imageset/attachment_play_button@2x.png diff --git a/Session/Images.xcassets/attachment_play_button.imageset/attachment_play_button@3x.png b/Session/Meta/Images.xcassets/attachment_play_button.imageset/attachment_play_button@3x.png similarity index 100% rename from Session/Images.xcassets/attachment_play_button.imageset/attachment_play_button@3x.png rename to Session/Meta/Images.xcassets/attachment_play_button.imageset/attachment_play_button@3x.png diff --git a/Session/Images.xcassets/audio-call-mute-active.imageset/Contents.json b/Session/Meta/Images.xcassets/audio-call-mute-active.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/audio-call-mute-active.imageset/Contents.json rename to Session/Meta/Images.xcassets/audio-call-mute-active.imageset/Contents.json diff --git a/Session/Images.xcassets/audio-call-mute-active.imageset/ic_mute_active.png b/Session/Meta/Images.xcassets/audio-call-mute-active.imageset/ic_mute_active.png similarity index 100% rename from Session/Images.xcassets/audio-call-mute-active.imageset/ic_mute_active.png rename to Session/Meta/Images.xcassets/audio-call-mute-active.imageset/ic_mute_active.png diff --git a/Session/Images.xcassets/audio-call-mute-inactive.imageset/Contents.json b/Session/Meta/Images.xcassets/audio-call-mute-inactive.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/audio-call-mute-inactive.imageset/Contents.json rename to Session/Meta/Images.xcassets/audio-call-mute-inactive.imageset/Contents.json diff --git a/Session/Images.xcassets/audio-call-mute-inactive.imageset/ic_mute_inactive.png b/Session/Meta/Images.xcassets/audio-call-mute-inactive.imageset/ic_mute_inactive.png similarity index 100% rename from Session/Images.xcassets/audio-call-mute-inactive.imageset/ic_mute_inactive.png rename to Session/Meta/Images.xcassets/audio-call-mute-inactive.imageset/ic_mute_inactive.png diff --git a/Session/Images.xcassets/audio-call-speaker-active.imageset/Contents.json b/Session/Meta/Images.xcassets/audio-call-speaker-active.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/audio-call-speaker-active.imageset/Contents.json rename to Session/Meta/Images.xcassets/audio-call-speaker-active.imageset/Contents.json diff --git a/Session/Images.xcassets/audio-call-speaker-active.imageset/ic_speaker_active.png b/Session/Meta/Images.xcassets/audio-call-speaker-active.imageset/ic_speaker_active.png similarity index 100% rename from Session/Images.xcassets/audio-call-speaker-active.imageset/ic_speaker_active.png rename to Session/Meta/Images.xcassets/audio-call-speaker-active.imageset/ic_speaker_active.png diff --git a/Session/Images.xcassets/audio-call-speaker-inactive.imageset/Contents.json b/Session/Meta/Images.xcassets/audio-call-speaker-inactive.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/audio-call-speaker-inactive.imageset/Contents.json rename to Session/Meta/Images.xcassets/audio-call-speaker-inactive.imageset/Contents.json diff --git a/Session/Images.xcassets/audio-call-speaker-inactive.imageset/ic_speaker_inactive.png b/Session/Meta/Images.xcassets/audio-call-speaker-inactive.imageset/ic_speaker_inactive.png similarity index 100% rename from Session/Images.xcassets/audio-call-speaker-inactive.imageset/ic_speaker_inactive.png rename to Session/Meta/Images.xcassets/audio-call-speaker-inactive.imageset/ic_speaker_inactive.png diff --git a/Session/Images.xcassets/audio-call-video-active.imageset/Contents.json b/Session/Meta/Images.xcassets/audio-call-video-active.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/audio-call-video-active.imageset/Contents.json rename to Session/Meta/Images.xcassets/audio-call-video-active.imageset/Contents.json diff --git a/Session/Images.xcassets/audio-call-video-active.imageset/ic_video_active.png b/Session/Meta/Images.xcassets/audio-call-video-active.imageset/ic_video_active.png similarity index 100% rename from Session/Images.xcassets/audio-call-video-active.imageset/ic_video_active.png rename to Session/Meta/Images.xcassets/audio-call-video-active.imageset/ic_video_active.png diff --git a/Session/Images.xcassets/audio-call-video-inactive.imageset/Contents.json b/Session/Meta/Images.xcassets/audio-call-video-inactive.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/audio-call-video-inactive.imageset/Contents.json rename to Session/Meta/Images.xcassets/audio-call-video-inactive.imageset/Contents.json diff --git a/Session/Images.xcassets/audio-call-video-inactive.imageset/ic_video_inactive.png b/Session/Meta/Images.xcassets/audio-call-video-inactive.imageset/ic_video_inactive.png similarity index 100% rename from Session/Images.xcassets/audio-call-video-inactive.imageset/ic_video_inactive.png rename to Session/Meta/Images.xcassets/audio-call-video-inactive.imageset/ic_video_inactive.png diff --git a/Session/Images.xcassets/audio_pause_black_48.imageset/Contents.json b/Session/Meta/Images.xcassets/audio_pause_black_48.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/audio_pause_black_48.imageset/Contents.json rename to Session/Meta/Images.xcassets/audio_pause_black_48.imageset/Contents.json diff --git a/Session/Images.xcassets/audio_pause_black_48.imageset/pause-48@1x.png b/Session/Meta/Images.xcassets/audio_pause_black_48.imageset/pause-48@1x.png similarity index 100% rename from Session/Images.xcassets/audio_pause_black_48.imageset/pause-48@1x.png rename to Session/Meta/Images.xcassets/audio_pause_black_48.imageset/pause-48@1x.png diff --git a/Session/Images.xcassets/audio_pause_black_48.imageset/pause-48@2x.png b/Session/Meta/Images.xcassets/audio_pause_black_48.imageset/pause-48@2x.png similarity index 100% rename from Session/Images.xcassets/audio_pause_black_48.imageset/pause-48@2x.png rename to Session/Meta/Images.xcassets/audio_pause_black_48.imageset/pause-48@2x.png diff --git a/Session/Images.xcassets/audio_pause_black_48.imageset/pause-48@3x.png b/Session/Meta/Images.xcassets/audio_pause_black_48.imageset/pause-48@3x.png similarity index 100% rename from Session/Images.xcassets/audio_pause_black_48.imageset/pause-48@3x.png rename to Session/Meta/Images.xcassets/audio_pause_black_48.imageset/pause-48@3x.png diff --git a/Session/Images.xcassets/audio_pause_black_large.imageset/Contents.json b/Session/Meta/Images.xcassets/audio_pause_black_large.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/audio_pause_black_large.imageset/Contents.json rename to Session/Meta/Images.xcassets/audio_pause_black_large.imageset/Contents.json diff --git a/Session/Images.xcassets/audio_pause_black_large.imageset/audio_pause_black_large@1x.png b/Session/Meta/Images.xcassets/audio_pause_black_large.imageset/audio_pause_black_large@1x.png similarity index 100% rename from Session/Images.xcassets/audio_pause_black_large.imageset/audio_pause_black_large@1x.png rename to Session/Meta/Images.xcassets/audio_pause_black_large.imageset/audio_pause_black_large@1x.png diff --git a/Session/Images.xcassets/audio_pause_black_large.imageset/audio_pause_black_large@2x.png b/Session/Meta/Images.xcassets/audio_pause_black_large.imageset/audio_pause_black_large@2x.png similarity index 100% rename from Session/Images.xcassets/audio_pause_black_large.imageset/audio_pause_black_large@2x.png rename to Session/Meta/Images.xcassets/audio_pause_black_large.imageset/audio_pause_black_large@2x.png diff --git a/Session/Images.xcassets/audio_pause_black_large.imageset/audio_pause_black_large@3x.png b/Session/Meta/Images.xcassets/audio_pause_black_large.imageset/audio_pause_black_large@3x.png similarity index 100% rename from Session/Images.xcassets/audio_pause_black_large.imageset/audio_pause_black_large@3x.png rename to Session/Meta/Images.xcassets/audio_pause_black_large.imageset/audio_pause_black_large@3x.png diff --git a/Session/Images.xcassets/audio_play_black_48.imageset/Contents.json b/Session/Meta/Images.xcassets/audio_play_black_48.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/audio_play_black_48.imageset/Contents.json rename to Session/Meta/Images.xcassets/audio_play_black_48.imageset/Contents.json diff --git a/Session/Images.xcassets/audio_play_black_48.imageset/play-48@1x.png b/Session/Meta/Images.xcassets/audio_play_black_48.imageset/play-48@1x.png similarity index 100% rename from Session/Images.xcassets/audio_play_black_48.imageset/play-48@1x.png rename to Session/Meta/Images.xcassets/audio_play_black_48.imageset/play-48@1x.png diff --git a/Session/Images.xcassets/audio_play_black_48.imageset/play-48@2x.png b/Session/Meta/Images.xcassets/audio_play_black_48.imageset/play-48@2x.png similarity index 100% rename from Session/Images.xcassets/audio_play_black_48.imageset/play-48@2x.png rename to Session/Meta/Images.xcassets/audio_play_black_48.imageset/play-48@2x.png diff --git a/Session/Images.xcassets/audio_play_black_48.imageset/play-48@3x.png b/Session/Meta/Images.xcassets/audio_play_black_48.imageset/play-48@3x.png similarity index 100% rename from Session/Images.xcassets/audio_play_black_48.imageset/play-48@3x.png rename to Session/Meta/Images.xcassets/audio_play_black_48.imageset/play-48@3x.png diff --git a/Session/Images.xcassets/audio_play_black_large.imageset/Contents.json b/Session/Meta/Images.xcassets/audio_play_black_large.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/audio_play_black_large.imageset/Contents.json rename to Session/Meta/Images.xcassets/audio_play_black_large.imageset/Contents.json diff --git a/Session/Images.xcassets/audio_play_black_large.imageset/audio_play_black_large@1x.png b/Session/Meta/Images.xcassets/audio_play_black_large.imageset/audio_play_black_large@1x.png similarity index 100% rename from Session/Images.xcassets/audio_play_black_large.imageset/audio_play_black_large@1x.png rename to Session/Meta/Images.xcassets/audio_play_black_large.imageset/audio_play_black_large@1x.png diff --git a/Session/Images.xcassets/audio_play_black_large.imageset/audio_play_black_large@2x.png b/Session/Meta/Images.xcassets/audio_play_black_large.imageset/audio_play_black_large@2x.png similarity index 100% rename from Session/Images.xcassets/audio_play_black_large.imageset/audio_play_black_large@2x.png rename to Session/Meta/Images.xcassets/audio_play_black_large.imageset/audio_play_black_large@2x.png diff --git a/Session/Images.xcassets/audio_play_black_large.imageset/audio_play_black_large@3x.png b/Session/Meta/Images.xcassets/audio_play_black_large.imageset/audio_play_black_large@3x.png similarity index 100% rename from Session/Images.xcassets/audio_play_black_large.imageset/audio_play_black_large@3x.png rename to Session/Meta/Images.xcassets/audio_play_black_large.imageset/audio_play_black_large@3x.png diff --git a/Session/Images.xcassets/banner_close.imageset/Contents.json b/Session/Meta/Images.xcassets/banner_close.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/banner_close.imageset/Contents.json rename to Session/Meta/Images.xcassets/banner_close.imageset/Contents.json diff --git a/Session/Images.xcassets/banner_close.imageset/banner_close@1x.png b/Session/Meta/Images.xcassets/banner_close.imageset/banner_close@1x.png similarity index 100% rename from Session/Images.xcassets/banner_close.imageset/banner_close@1x.png rename to Session/Meta/Images.xcassets/banner_close.imageset/banner_close@1x.png diff --git a/Session/Images.xcassets/banner_close.imageset/banner_close@2x.png b/Session/Meta/Images.xcassets/banner_close.imageset/banner_close@2x.png similarity index 100% rename from Session/Images.xcassets/banner_close.imageset/banner_close@2x.png rename to Session/Meta/Images.xcassets/banner_close.imageset/banner_close@2x.png diff --git a/Session/Images.xcassets/banner_close.imageset/banner_close@3x.png b/Session/Meta/Images.xcassets/banner_close.imageset/banner_close@3x.png similarity index 100% rename from Session/Images.xcassets/banner_close.imageset/banner_close@3x.png rename to Session/Meta/Images.xcassets/banner_close.imageset/banner_close@3x.png diff --git a/Session/Images.xcassets/btnCancel--blue.imageset/Contents.json b/Session/Meta/Images.xcassets/btnCancel--blue.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/btnCancel--blue.imageset/Contents.json rename to Session/Meta/Images.xcassets/btnCancel--blue.imageset/Contents.json diff --git a/Session/Images.xcassets/btnCancel--blue.imageset/btnCancel--blue.pdf b/Session/Meta/Images.xcassets/btnCancel--blue.imageset/btnCancel--blue.pdf similarity index 100% rename from Session/Images.xcassets/btnCancel--blue.imageset/btnCancel--blue.pdf rename to Session/Meta/Images.xcassets/btnCancel--blue.imageset/btnCancel--blue.pdf diff --git a/Session/Images.xcassets/btnCancel--white.imageset/Contents.json b/Session/Meta/Images.xcassets/btnCancel--white.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/btnCancel--white.imageset/Contents.json rename to Session/Meta/Images.xcassets/btnCancel--white.imageset/Contents.json diff --git a/Session/Images.xcassets/btnCancel--white.imageset/cancel.pdf b/Session/Meta/Images.xcassets/btnCancel--white.imageset/cancel.pdf similarity index 100% rename from Session/Images.xcassets/btnCancel--white.imageset/cancel.pdf rename to Session/Meta/Images.xcassets/btnCancel--white.imageset/cancel.pdf diff --git a/Session/Images.xcassets/btnGroup--white.imageset/Contents.json b/Session/Meta/Images.xcassets/btnGroup--white.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/btnGroup--white.imageset/Contents.json rename to Session/Meta/Images.xcassets/btnGroup--white.imageset/Contents.json diff --git a/Session/Images.xcassets/btnGroup--white.imageset/add_group.pdf b/Session/Meta/Images.xcassets/btnGroup--white.imageset/add_group.pdf similarity index 100% rename from Session/Images.xcassets/btnGroup--white.imageset/add_group.pdf rename to Session/Meta/Images.xcassets/btnGroup--white.imageset/add_group.pdf diff --git a/Session/Images.xcassets/btnQRShow--white-1.imageset/Contents.json b/Session/Meta/Images.xcassets/btnQRShow--white-1.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/btnQRShow--white-1.imageset/Contents.json rename to Session/Meta/Images.xcassets/btnQRShow--white-1.imageset/Contents.json diff --git a/Session/Images.xcassets/btnQRShow--white-1.imageset/btnQRShow--white.pdf b/Session/Meta/Images.xcassets/btnQRShow--white-1.imageset/btnQRShow--white.pdf similarity index 100% rename from Session/Images.xcassets/btnQRShow--white-1.imageset/btnQRShow--white.pdf rename to Session/Meta/Images.xcassets/btnQRShow--white-1.imageset/btnQRShow--white.pdf diff --git a/Session/Images.xcassets/btnQRShow--white.imageset/Contents.json b/Session/Meta/Images.xcassets/btnQRShow--white.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/btnQRShow--white.imageset/Contents.json rename to Session/Meta/Images.xcassets/btnQRShow--white.imageset/Contents.json diff --git a/Session/Images.xcassets/btnQRShow--white.imageset/btnQRShow--white.pdf b/Session/Meta/Images.xcassets/btnQRShow--white.imageset/btnQRShow--white.pdf similarity index 100% rename from Session/Images.xcassets/btnQRShow--white.imageset/btnQRShow--white.pdf rename to Session/Meta/Images.xcassets/btnQRShow--white.imageset/btnQRShow--white.pdf diff --git a/Session/Images.xcassets/btnRefresh--white.imageset/Contents.json b/Session/Meta/Images.xcassets/btnRefresh--white.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/btnRefresh--white.imageset/Contents.json rename to Session/Meta/Images.xcassets/btnRefresh--white.imageset/Contents.json diff --git a/Session/Images.xcassets/btnRefresh--white.imageset/btnRefresh--white.pdf b/Session/Meta/Images.xcassets/btnRefresh--white.imageset/btnRefresh--white.pdf similarity index 100% rename from Session/Images.xcassets/btnRefresh--white.imageset/btnRefresh--white.pdf rename to Session/Meta/Images.xcassets/btnRefresh--white.imageset/btnRefresh--white.pdf diff --git a/Session/Images.xcassets/button_phone_white.imageset/Contents.json b/Session/Meta/Images.xcassets/button_phone_white.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/button_phone_white.imageset/Contents.json rename to Session/Meta/Images.xcassets/button_phone_white.imageset/Contents.json diff --git a/Session/Images.xcassets/button_phone_white.imageset/button_phone_white@1x.png b/Session/Meta/Images.xcassets/button_phone_white.imageset/button_phone_white@1x.png similarity index 100% rename from Session/Images.xcassets/button_phone_white.imageset/button_phone_white@1x.png rename to Session/Meta/Images.xcassets/button_phone_white.imageset/button_phone_white@1x.png diff --git a/Session/Images.xcassets/button_phone_white.imageset/button_phone_white@2x.png b/Session/Meta/Images.xcassets/button_phone_white.imageset/button_phone_white@2x.png similarity index 100% rename from Session/Images.xcassets/button_phone_white.imageset/button_phone_white@2x.png rename to Session/Meta/Images.xcassets/button_phone_white.imageset/button_phone_white@2x.png diff --git a/Session/Images.xcassets/button_phone_white.imageset/button_phone_white@3x.png b/Session/Meta/Images.xcassets/button_phone_white.imageset/button_phone_white@3x.png similarity index 100% rename from Session/Images.xcassets/button_phone_white.imageset/button_phone_white@3x.png rename to Session/Meta/Images.xcassets/button_phone_white.imageset/button_phone_white@3x.png diff --git a/Session/Images.xcassets/button_settings_white.imageset/Contents.json b/Session/Meta/Images.xcassets/button_settings_white.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/button_settings_white.imageset/Contents.json rename to Session/Meta/Images.xcassets/button_settings_white.imageset/Contents.json diff --git a/Session/Images.xcassets/button_settings_white.imageset/button_settings_white@1x.png b/Session/Meta/Images.xcassets/button_settings_white.imageset/button_settings_white@1x.png similarity index 100% rename from Session/Images.xcassets/button_settings_white.imageset/button_settings_white@1x.png rename to Session/Meta/Images.xcassets/button_settings_white.imageset/button_settings_white@1x.png diff --git a/Session/Images.xcassets/button_settings_white.imageset/button_settings_white@2x.png b/Session/Meta/Images.xcassets/button_settings_white.imageset/button_settings_white@2x.png similarity index 100% rename from Session/Images.xcassets/button_settings_white.imageset/button_settings_white@2x.png rename to Session/Meta/Images.xcassets/button_settings_white.imageset/button_settings_white@2x.png diff --git a/Session/Images.xcassets/button_settings_white.imageset/button_settings_white@3x.png b/Session/Meta/Images.xcassets/button_settings_white.imageset/button_settings_white@3x.png similarity index 100% rename from Session/Images.xcassets/button_settings_white.imageset/button_settings_white@3x.png rename to Session/Meta/Images.xcassets/button_settings_white.imageset/button_settings_white@3x.png diff --git a/Session/Images.xcassets/call-active-wide.imageset/Contents.json b/Session/Meta/Images.xcassets/call-active-wide.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/call-active-wide.imageset/Contents.json rename to Session/Meta/Images.xcassets/call-active-wide.imageset/Contents.json diff --git a/Session/Images.xcassets/call-active-wide.imageset/call-active-wide.png b/Session/Meta/Images.xcassets/call-active-wide.imageset/call-active-wide.png similarity index 100% rename from Session/Images.xcassets/call-active-wide.imageset/call-active-wide.png rename to Session/Meta/Images.xcassets/call-active-wide.imageset/call-active-wide.png diff --git a/Session/Images.xcassets/cancel-cross-white.imageset/Contents.json b/Session/Meta/Images.xcassets/cancel-cross-white.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/cancel-cross-white.imageset/Contents.json rename to Session/Meta/Images.xcassets/cancel-cross-white.imageset/Contents.json diff --git a/Session/Images.xcassets/cancel-cross-white.imageset/cancel-cross-white@1x.png b/Session/Meta/Images.xcassets/cancel-cross-white.imageset/cancel-cross-white@1x.png similarity index 100% rename from Session/Images.xcassets/cancel-cross-white.imageset/cancel-cross-white@1x.png rename to Session/Meta/Images.xcassets/cancel-cross-white.imageset/cancel-cross-white@1x.png diff --git a/Session/Images.xcassets/cancel-cross-white.imageset/cancel-cross-white@2x.png b/Session/Meta/Images.xcassets/cancel-cross-white.imageset/cancel-cross-white@2x.png similarity index 100% rename from Session/Images.xcassets/cancel-cross-white.imageset/cancel-cross-white@2x.png rename to Session/Meta/Images.xcassets/cancel-cross-white.imageset/cancel-cross-white@2x.png diff --git a/Session/Images.xcassets/cancel-cross-white.imageset/cancel-cross-white@3x.png b/Session/Meta/Images.xcassets/cancel-cross-white.imageset/cancel-cross-white@3x.png similarity index 100% rename from Session/Images.xcassets/cancel-cross-white.imageset/cancel-cross-white@3x.png rename to Session/Meta/Images.xcassets/cancel-cross-white.imageset/cancel-cross-white@3x.png diff --git a/Session/Images.xcassets/cellBtnDelete.imageset/Contents.json b/Session/Meta/Images.xcassets/cellBtnDelete.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/cellBtnDelete.imageset/Contents.json rename to Session/Meta/Images.xcassets/cellBtnDelete.imageset/Contents.json diff --git a/Session/Images.xcassets/cellBtnDelete.imageset/cellBtnDelete.pdf b/Session/Meta/Images.xcassets/cellBtnDelete.imageset/cellBtnDelete.pdf similarity index 100% rename from Session/Images.xcassets/cellBtnDelete.imageset/cellBtnDelete.pdf rename to Session/Meta/Images.xcassets/cellBtnDelete.imageset/cellBtnDelete.pdf diff --git a/Session/Images.xcassets/cellBtnMoveToArchive--blue.imageset/Contents.json b/Session/Meta/Images.xcassets/cellBtnMoveToArchive--blue.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/cellBtnMoveToArchive--blue.imageset/Contents.json rename to Session/Meta/Images.xcassets/cellBtnMoveToArchive--blue.imageset/Contents.json diff --git a/Session/Images.xcassets/cellBtnMoveToArchive--blue.imageset/cellBtnMoveToArchive--blue.pdf b/Session/Meta/Images.xcassets/cellBtnMoveToArchive--blue.imageset/cellBtnMoveToArchive--blue.pdf similarity index 100% rename from Session/Images.xcassets/cellBtnMoveToArchive--blue.imageset/cellBtnMoveToArchive--blue.pdf rename to Session/Meta/Images.xcassets/cellBtnMoveToArchive--blue.imageset/cellBtnMoveToArchive--blue.pdf diff --git a/Session/Images.xcassets/cellBtnMoveToInbox--blue.imageset/Contents.json b/Session/Meta/Images.xcassets/cellBtnMoveToInbox--blue.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/cellBtnMoveToInbox--blue.imageset/Contents.json rename to Session/Meta/Images.xcassets/cellBtnMoveToInbox--blue.imageset/Contents.json diff --git a/Session/Images.xcassets/cellBtnMoveToInbox--blue.imageset/cellBtnMoveToInbox--blue.pdf b/Session/Meta/Images.xcassets/cellBtnMoveToInbox--blue.imageset/cellBtnMoveToInbox--blue.pdf similarity index 100% rename from Session/Images.xcassets/cellBtnMoveToInbox--blue.imageset/cellBtnMoveToInbox--blue.pdf rename to Session/Meta/Images.xcassets/cellBtnMoveToInbox--blue.imageset/cellBtnMoveToInbox--blue.pdf diff --git a/Session/Images.xcassets/compose-cancel.imageset/Contents.json b/Session/Meta/Images.xcassets/compose-cancel.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/compose-cancel.imageset/Contents.json rename to Session/Meta/Images.xcassets/compose-cancel.imageset/Contents.json diff --git a/Session/Images.xcassets/compose-cancel.imageset/x-20@1x.png b/Session/Meta/Images.xcassets/compose-cancel.imageset/x-20@1x.png similarity index 100% rename from Session/Images.xcassets/compose-cancel.imageset/x-20@1x.png rename to Session/Meta/Images.xcassets/compose-cancel.imageset/x-20@1x.png diff --git a/Session/Images.xcassets/compose-cancel.imageset/x-20@2x.png b/Session/Meta/Images.xcassets/compose-cancel.imageset/x-20@2x.png similarity index 100% rename from Session/Images.xcassets/compose-cancel.imageset/x-20@2x.png rename to Session/Meta/Images.xcassets/compose-cancel.imageset/x-20@2x.png diff --git a/Session/Images.xcassets/compose-cancel.imageset/x-20@3x.png b/Session/Meta/Images.xcassets/compose-cancel.imageset/x-20@3x.png similarity index 100% rename from Session/Images.xcassets/compose-cancel.imageset/x-20@3x.png rename to Session/Meta/Images.xcassets/compose-cancel.imageset/x-20@3x.png diff --git a/Session/Images.xcassets/contact-avatar-1024.imageset/Contents.json b/Session/Meta/Images.xcassets/contact-avatar-1024.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/contact-avatar-1024.imageset/Contents.json rename to Session/Meta/Images.xcassets/contact-avatar-1024.imageset/Contents.json diff --git a/Session/Images.xcassets/contact-avatar-1024.imageset/contact-avatar-1024.png b/Session/Meta/Images.xcassets/contact-avatar-1024.imageset/contact-avatar-1024.png similarity index 100% rename from Session/Images.xcassets/contact-avatar-1024.imageset/contact-avatar-1024.png rename to Session/Meta/Images.xcassets/contact-avatar-1024.imageset/contact-avatar-1024.png diff --git a/Session/Images.xcassets/contact-avatar-84.imageset/Contents.json b/Session/Meta/Images.xcassets/contact-avatar-84.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/contact-avatar-84.imageset/Contents.json rename to Session/Meta/Images.xcassets/contact-avatar-84.imageset/Contents.json diff --git a/Session/Images.xcassets/contact-avatar-84.imageset/contact-avatar-84.png b/Session/Meta/Images.xcassets/contact-avatar-84.imageset/contact-avatar-84.png similarity index 100% rename from Session/Images.xcassets/contact-avatar-84.imageset/contact-avatar-84.png rename to Session/Meta/Images.xcassets/contact-avatar-84.imageset/contact-avatar-84.png diff --git a/Session/Images.xcassets/contact-options-action.imageset/Contents.json b/Session/Meta/Images.xcassets/contact-options-action.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/contact-options-action.imageset/Contents.json rename to Session/Meta/Images.xcassets/contact-options-action.imageset/Contents.json diff --git a/Session/Images.xcassets/contact-options-action.imageset/contact-options-action.pdf b/Session/Meta/Images.xcassets/contact-options-action.imageset/contact-options-action.pdf similarity index 100% rename from Session/Images.xcassets/contact-options-action.imageset/contact-options-action.pdf rename to Session/Meta/Images.xcassets/contact-options-action.imageset/contact-options-action.pdf diff --git a/Session/Images.xcassets/contact_checkbox_checked.imageset/Contents.json b/Session/Meta/Images.xcassets/contact_checkbox_checked.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/contact_checkbox_checked.imageset/Contents.json rename to Session/Meta/Images.xcassets/contact_checkbox_checked.imageset/Contents.json diff --git a/Session/Images.xcassets/contact_checkbox_checked.imageset/checkbox_checked@1x.png b/Session/Meta/Images.xcassets/contact_checkbox_checked.imageset/checkbox_checked@1x.png similarity index 100% rename from Session/Images.xcassets/contact_checkbox_checked.imageset/checkbox_checked@1x.png rename to Session/Meta/Images.xcassets/contact_checkbox_checked.imageset/checkbox_checked@1x.png diff --git a/Session/Images.xcassets/contact_checkbox_checked.imageset/checkbox_checked@2x.png b/Session/Meta/Images.xcassets/contact_checkbox_checked.imageset/checkbox_checked@2x.png similarity index 100% rename from Session/Images.xcassets/contact_checkbox_checked.imageset/checkbox_checked@2x.png rename to Session/Meta/Images.xcassets/contact_checkbox_checked.imageset/checkbox_checked@2x.png diff --git a/Session/Images.xcassets/contact_checkbox_checked.imageset/checkbox_checked@3x.png b/Session/Meta/Images.xcassets/contact_checkbox_checked.imageset/checkbox_checked@3x.png similarity index 100% rename from Session/Images.xcassets/contact_checkbox_checked.imageset/checkbox_checked@3x.png rename to Session/Meta/Images.xcassets/contact_checkbox_checked.imageset/checkbox_checked@3x.png diff --git a/Session/Images.xcassets/contact_checkbox_unchecked.imageset/Contents.json b/Session/Meta/Images.xcassets/contact_checkbox_unchecked.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/contact_checkbox_unchecked.imageset/Contents.json rename to Session/Meta/Images.xcassets/contact_checkbox_unchecked.imageset/Contents.json diff --git a/Session/Images.xcassets/contact_checkbox_unchecked.imageset/checkbox_unchecked@1x.png b/Session/Meta/Images.xcassets/contact_checkbox_unchecked.imageset/checkbox_unchecked@1x.png similarity index 100% rename from Session/Images.xcassets/contact_checkbox_unchecked.imageset/checkbox_unchecked@1x.png rename to Session/Meta/Images.xcassets/contact_checkbox_unchecked.imageset/checkbox_unchecked@1x.png diff --git a/Session/Images.xcassets/contact_checkbox_unchecked.imageset/checkbox_unchecked@2x.png b/Session/Meta/Images.xcassets/contact_checkbox_unchecked.imageset/checkbox_unchecked@2x.png similarity index 100% rename from Session/Images.xcassets/contact_checkbox_unchecked.imageset/checkbox_unchecked@2x.png rename to Session/Meta/Images.xcassets/contact_checkbox_unchecked.imageset/checkbox_unchecked@2x.png diff --git a/Session/Images.xcassets/contact_checkbox_unchecked.imageset/checkbox_unchecked@3x.png b/Session/Meta/Images.xcassets/contact_checkbox_unchecked.imageset/checkbox_unchecked@3x.png similarity index 100% rename from Session/Images.xcassets/contact_checkbox_unchecked.imageset/checkbox_unchecked@3x.png rename to Session/Meta/Images.xcassets/contact_checkbox_unchecked.imageset/checkbox_unchecked@3x.png diff --git a/Session/Images.xcassets/contact_view_audio_call.imageset/Contents.json b/Session/Meta/Images.xcassets/contact_view_audio_call.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/contact_view_audio_call.imageset/Contents.json rename to Session/Meta/Images.xcassets/contact_view_audio_call.imageset/Contents.json diff --git a/Session/Images.xcassets/contact_view_audio_call.imageset/phone_20@1x.png b/Session/Meta/Images.xcassets/contact_view_audio_call.imageset/phone_20@1x.png similarity index 100% rename from Session/Images.xcassets/contact_view_audio_call.imageset/phone_20@1x.png rename to Session/Meta/Images.xcassets/contact_view_audio_call.imageset/phone_20@1x.png diff --git a/Session/Images.xcassets/contact_view_audio_call.imageset/phone_20@2x.png b/Session/Meta/Images.xcassets/contact_view_audio_call.imageset/phone_20@2x.png similarity index 100% rename from Session/Images.xcassets/contact_view_audio_call.imageset/phone_20@2x.png rename to Session/Meta/Images.xcassets/contact_view_audio_call.imageset/phone_20@2x.png diff --git a/Session/Images.xcassets/contact_view_audio_call.imageset/phone_20@3x.png b/Session/Meta/Images.xcassets/contact_view_audio_call.imageset/phone_20@3x.png similarity index 100% rename from Session/Images.xcassets/contact_view_audio_call.imageset/phone_20@3x.png rename to Session/Meta/Images.xcassets/contact_view_audio_call.imageset/phone_20@3x.png diff --git a/Session/Images.xcassets/contact_view_message.imageset/Contents.json b/Session/Meta/Images.xcassets/contact_view_message.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/contact_view_message.imageset/Contents.json rename to Session/Meta/Images.xcassets/contact_view_message.imageset/Contents.json diff --git a/Session/Images.xcassets/contact_view_message.imageset/message_20@1x.png b/Session/Meta/Images.xcassets/contact_view_message.imageset/message_20@1x.png similarity index 100% rename from Session/Images.xcassets/contact_view_message.imageset/message_20@1x.png rename to Session/Meta/Images.xcassets/contact_view_message.imageset/message_20@1x.png diff --git a/Session/Images.xcassets/contact_view_message.imageset/message_20@2x.png b/Session/Meta/Images.xcassets/contact_view_message.imageset/message_20@2x.png similarity index 100% rename from Session/Images.xcassets/contact_view_message.imageset/message_20@2x.png rename to Session/Meta/Images.xcassets/contact_view_message.imageset/message_20@2x.png diff --git a/Session/Images.xcassets/contact_view_message.imageset/message_20@3x.png b/Session/Meta/Images.xcassets/contact_view_message.imageset/message_20@3x.png similarity index 100% rename from Session/Images.xcassets/contact_view_message.imageset/message_20@3x.png rename to Session/Meta/Images.xcassets/contact_view_message.imageset/message_20@3x.png diff --git a/Session/Images.xcassets/contact_view_video_call.imageset/Contents.json b/Session/Meta/Images.xcassets/contact_view_video_call.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/contact_view_video_call.imageset/Contents.json rename to Session/Meta/Images.xcassets/contact_view_video_call.imageset/Contents.json diff --git a/Session/Images.xcassets/contact_view_video_call.imageset/video_20@1x.png b/Session/Meta/Images.xcassets/contact_view_video_call.imageset/video_20@1x.png similarity index 100% rename from Session/Images.xcassets/contact_view_video_call.imageset/video_20@1x.png rename to Session/Meta/Images.xcassets/contact_view_video_call.imageset/video_20@1x.png diff --git a/Session/Images.xcassets/contact_view_video_call.imageset/video_20@2x.png b/Session/Meta/Images.xcassets/contact_view_video_call.imageset/video_20@2x.png similarity index 100% rename from Session/Images.xcassets/contact_view_video_call.imageset/video_20@2x.png rename to Session/Meta/Images.xcassets/contact_view_video_call.imageset/video_20@2x.png diff --git a/Session/Images.xcassets/contact_view_video_call.imageset/video_20@3x.png b/Session/Meta/Images.xcassets/contact_view_video_call.imageset/video_20@3x.png similarity index 100% rename from Session/Images.xcassets/contact_view_video_call.imageset/video_20@3x.png rename to Session/Meta/Images.xcassets/contact_view_video_call.imageset/video_20@3x.png diff --git a/Session/Images.xcassets/conversation_settings_search.imageset/Contents.json b/Session/Meta/Images.xcassets/conversation_settings_search.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/conversation_settings_search.imageset/Contents.json rename to Session/Meta/Images.xcassets/conversation_settings_search.imageset/Contents.json diff --git a/Session/Images.xcassets/conversation_settings_search.imageset/search-24@1x.png b/Session/Meta/Images.xcassets/conversation_settings_search.imageset/search-24@1x.png similarity index 100% rename from Session/Images.xcassets/conversation_settings_search.imageset/search-24@1x.png rename to Session/Meta/Images.xcassets/conversation_settings_search.imageset/search-24@1x.png diff --git a/Session/Images.xcassets/conversation_settings_search.imageset/search-24@2x.png b/Session/Meta/Images.xcassets/conversation_settings_search.imageset/search-24@2x.png similarity index 100% rename from Session/Images.xcassets/conversation_settings_search.imageset/search-24@2x.png rename to Session/Meta/Images.xcassets/conversation_settings_search.imageset/search-24@2x.png diff --git a/Session/Images.xcassets/conversation_settings_search.imageset/search-24@3x.png b/Session/Meta/Images.xcassets/conversation_settings_search.imageset/search-24@3x.png similarity index 100% rename from Session/Images.xcassets/conversation_settings_search.imageset/search-24@3x.png rename to Session/Meta/Images.xcassets/conversation_settings_search.imageset/search-24@3x.png diff --git a/Session/Images.xcassets/disappearing_message_00.imageset/Contents.json b/Session/Meta/Images.xcassets/disappearing_message_00.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/disappearing_message_00.imageset/Contents.json rename to Session/Meta/Images.xcassets/disappearing_message_00.imageset/Contents.json diff --git a/Session/Images.xcassets/disappearing_message_00.imageset/timer00_12@1x.png b/Session/Meta/Images.xcassets/disappearing_message_00.imageset/timer00_12@1x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_00.imageset/timer00_12@1x.png rename to Session/Meta/Images.xcassets/disappearing_message_00.imageset/timer00_12@1x.png diff --git a/Session/Images.xcassets/disappearing_message_00.imageset/timer00_12@2x.png b/Session/Meta/Images.xcassets/disappearing_message_00.imageset/timer00_12@2x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_00.imageset/timer00_12@2x.png rename to Session/Meta/Images.xcassets/disappearing_message_00.imageset/timer00_12@2x.png diff --git a/Session/Images.xcassets/disappearing_message_00.imageset/timer00_12@3x.png b/Session/Meta/Images.xcassets/disappearing_message_00.imageset/timer00_12@3x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_00.imageset/timer00_12@3x.png rename to Session/Meta/Images.xcassets/disappearing_message_00.imageset/timer00_12@3x.png diff --git a/Session/Images.xcassets/disappearing_message_05.imageset/Contents.json b/Session/Meta/Images.xcassets/disappearing_message_05.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/disappearing_message_05.imageset/Contents.json rename to Session/Meta/Images.xcassets/disappearing_message_05.imageset/Contents.json diff --git a/Session/Images.xcassets/disappearing_message_05.imageset/timer05_12@1x.png b/Session/Meta/Images.xcassets/disappearing_message_05.imageset/timer05_12@1x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_05.imageset/timer05_12@1x.png rename to Session/Meta/Images.xcassets/disappearing_message_05.imageset/timer05_12@1x.png diff --git a/Session/Images.xcassets/disappearing_message_05.imageset/timer05_12@2x.png b/Session/Meta/Images.xcassets/disappearing_message_05.imageset/timer05_12@2x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_05.imageset/timer05_12@2x.png rename to Session/Meta/Images.xcassets/disappearing_message_05.imageset/timer05_12@2x.png diff --git a/Session/Images.xcassets/disappearing_message_05.imageset/timer05_12@3x.png b/Session/Meta/Images.xcassets/disappearing_message_05.imageset/timer05_12@3x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_05.imageset/timer05_12@3x.png rename to Session/Meta/Images.xcassets/disappearing_message_05.imageset/timer05_12@3x.png diff --git a/Session/Images.xcassets/disappearing_message_10.imageset/Contents.json b/Session/Meta/Images.xcassets/disappearing_message_10.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/disappearing_message_10.imageset/Contents.json rename to Session/Meta/Images.xcassets/disappearing_message_10.imageset/Contents.json diff --git a/Session/Images.xcassets/disappearing_message_10.imageset/timer10_12@1x.png b/Session/Meta/Images.xcassets/disappearing_message_10.imageset/timer10_12@1x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_10.imageset/timer10_12@1x.png rename to Session/Meta/Images.xcassets/disappearing_message_10.imageset/timer10_12@1x.png diff --git a/Session/Images.xcassets/disappearing_message_10.imageset/timer10_12@2x.png b/Session/Meta/Images.xcassets/disappearing_message_10.imageset/timer10_12@2x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_10.imageset/timer10_12@2x.png rename to Session/Meta/Images.xcassets/disappearing_message_10.imageset/timer10_12@2x.png diff --git a/Session/Images.xcassets/disappearing_message_10.imageset/timer10_12@3x.png b/Session/Meta/Images.xcassets/disappearing_message_10.imageset/timer10_12@3x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_10.imageset/timer10_12@3x.png rename to Session/Meta/Images.xcassets/disappearing_message_10.imageset/timer10_12@3x.png diff --git a/Session/Images.xcassets/disappearing_message_15.imageset/Contents.json b/Session/Meta/Images.xcassets/disappearing_message_15.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/disappearing_message_15.imageset/Contents.json rename to Session/Meta/Images.xcassets/disappearing_message_15.imageset/Contents.json diff --git a/Session/Images.xcassets/disappearing_message_15.imageset/timer15_12@1x.png b/Session/Meta/Images.xcassets/disappearing_message_15.imageset/timer15_12@1x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_15.imageset/timer15_12@1x.png rename to Session/Meta/Images.xcassets/disappearing_message_15.imageset/timer15_12@1x.png diff --git a/Session/Images.xcassets/disappearing_message_15.imageset/timer15_12@2x.png b/Session/Meta/Images.xcassets/disappearing_message_15.imageset/timer15_12@2x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_15.imageset/timer15_12@2x.png rename to Session/Meta/Images.xcassets/disappearing_message_15.imageset/timer15_12@2x.png diff --git a/Session/Images.xcassets/disappearing_message_15.imageset/timer15_12@3x.png b/Session/Meta/Images.xcassets/disappearing_message_15.imageset/timer15_12@3x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_15.imageset/timer15_12@3x.png rename to Session/Meta/Images.xcassets/disappearing_message_15.imageset/timer15_12@3x.png diff --git a/Session/Images.xcassets/disappearing_message_20.imageset/Contents.json b/Session/Meta/Images.xcassets/disappearing_message_20.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/disappearing_message_20.imageset/Contents.json rename to Session/Meta/Images.xcassets/disappearing_message_20.imageset/Contents.json diff --git a/Session/Images.xcassets/disappearing_message_20.imageset/timer20_12@1x.png b/Session/Meta/Images.xcassets/disappearing_message_20.imageset/timer20_12@1x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_20.imageset/timer20_12@1x.png rename to Session/Meta/Images.xcassets/disappearing_message_20.imageset/timer20_12@1x.png diff --git a/Session/Images.xcassets/disappearing_message_20.imageset/timer20_12@2x.png b/Session/Meta/Images.xcassets/disappearing_message_20.imageset/timer20_12@2x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_20.imageset/timer20_12@2x.png rename to Session/Meta/Images.xcassets/disappearing_message_20.imageset/timer20_12@2x.png diff --git a/Session/Images.xcassets/disappearing_message_20.imageset/timer20_12@3x.png b/Session/Meta/Images.xcassets/disappearing_message_20.imageset/timer20_12@3x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_20.imageset/timer20_12@3x.png rename to Session/Meta/Images.xcassets/disappearing_message_20.imageset/timer20_12@3x.png diff --git a/Session/Images.xcassets/disappearing_message_25.imageset/Contents.json b/Session/Meta/Images.xcassets/disappearing_message_25.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/disappearing_message_25.imageset/Contents.json rename to Session/Meta/Images.xcassets/disappearing_message_25.imageset/Contents.json diff --git a/Session/Images.xcassets/disappearing_message_25.imageset/timer25_12@1x.png b/Session/Meta/Images.xcassets/disappearing_message_25.imageset/timer25_12@1x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_25.imageset/timer25_12@1x.png rename to Session/Meta/Images.xcassets/disappearing_message_25.imageset/timer25_12@1x.png diff --git a/Session/Images.xcassets/disappearing_message_25.imageset/timer25_12@2x.png b/Session/Meta/Images.xcassets/disappearing_message_25.imageset/timer25_12@2x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_25.imageset/timer25_12@2x.png rename to Session/Meta/Images.xcassets/disappearing_message_25.imageset/timer25_12@2x.png diff --git a/Session/Images.xcassets/disappearing_message_25.imageset/timer25_12@3x.png b/Session/Meta/Images.xcassets/disappearing_message_25.imageset/timer25_12@3x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_25.imageset/timer25_12@3x.png rename to Session/Meta/Images.xcassets/disappearing_message_25.imageset/timer25_12@3x.png diff --git a/Session/Images.xcassets/disappearing_message_30.imageset/Contents.json b/Session/Meta/Images.xcassets/disappearing_message_30.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/disappearing_message_30.imageset/Contents.json rename to Session/Meta/Images.xcassets/disappearing_message_30.imageset/Contents.json diff --git a/Session/Images.xcassets/disappearing_message_30.imageset/timer30_12@1x.png b/Session/Meta/Images.xcassets/disappearing_message_30.imageset/timer30_12@1x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_30.imageset/timer30_12@1x.png rename to Session/Meta/Images.xcassets/disappearing_message_30.imageset/timer30_12@1x.png diff --git a/Session/Images.xcassets/disappearing_message_30.imageset/timer30_12@2x.png b/Session/Meta/Images.xcassets/disappearing_message_30.imageset/timer30_12@2x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_30.imageset/timer30_12@2x.png rename to Session/Meta/Images.xcassets/disappearing_message_30.imageset/timer30_12@2x.png diff --git a/Session/Images.xcassets/disappearing_message_30.imageset/timer30_12@3x.png b/Session/Meta/Images.xcassets/disappearing_message_30.imageset/timer30_12@3x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_30.imageset/timer30_12@3x.png rename to Session/Meta/Images.xcassets/disappearing_message_30.imageset/timer30_12@3x.png diff --git a/Session/Images.xcassets/disappearing_message_35.imageset/Contents.json b/Session/Meta/Images.xcassets/disappearing_message_35.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/disappearing_message_35.imageset/Contents.json rename to Session/Meta/Images.xcassets/disappearing_message_35.imageset/Contents.json diff --git a/Session/Images.xcassets/disappearing_message_35.imageset/timer35_12@1x.png b/Session/Meta/Images.xcassets/disappearing_message_35.imageset/timer35_12@1x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_35.imageset/timer35_12@1x.png rename to Session/Meta/Images.xcassets/disappearing_message_35.imageset/timer35_12@1x.png diff --git a/Session/Images.xcassets/disappearing_message_35.imageset/timer35_12@2x.png b/Session/Meta/Images.xcassets/disappearing_message_35.imageset/timer35_12@2x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_35.imageset/timer35_12@2x.png rename to Session/Meta/Images.xcassets/disappearing_message_35.imageset/timer35_12@2x.png diff --git a/Session/Images.xcassets/disappearing_message_35.imageset/timer35_12@3x.png b/Session/Meta/Images.xcassets/disappearing_message_35.imageset/timer35_12@3x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_35.imageset/timer35_12@3x.png rename to Session/Meta/Images.xcassets/disappearing_message_35.imageset/timer35_12@3x.png diff --git a/Session/Images.xcassets/disappearing_message_40.imageset/Contents.json b/Session/Meta/Images.xcassets/disappearing_message_40.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/disappearing_message_40.imageset/Contents.json rename to Session/Meta/Images.xcassets/disappearing_message_40.imageset/Contents.json diff --git a/Session/Images.xcassets/disappearing_message_40.imageset/timer40_12@1x.png b/Session/Meta/Images.xcassets/disappearing_message_40.imageset/timer40_12@1x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_40.imageset/timer40_12@1x.png rename to Session/Meta/Images.xcassets/disappearing_message_40.imageset/timer40_12@1x.png diff --git a/Session/Images.xcassets/disappearing_message_40.imageset/timer40_12@2x.png b/Session/Meta/Images.xcassets/disappearing_message_40.imageset/timer40_12@2x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_40.imageset/timer40_12@2x.png rename to Session/Meta/Images.xcassets/disappearing_message_40.imageset/timer40_12@2x.png diff --git a/Session/Images.xcassets/disappearing_message_40.imageset/timer40_12@3x.png b/Session/Meta/Images.xcassets/disappearing_message_40.imageset/timer40_12@3x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_40.imageset/timer40_12@3x.png rename to Session/Meta/Images.xcassets/disappearing_message_40.imageset/timer40_12@3x.png diff --git a/Session/Images.xcassets/disappearing_message_45.imageset/Contents.json b/Session/Meta/Images.xcassets/disappearing_message_45.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/disappearing_message_45.imageset/Contents.json rename to Session/Meta/Images.xcassets/disappearing_message_45.imageset/Contents.json diff --git a/Session/Images.xcassets/disappearing_message_45.imageset/timer45_12@1x.png b/Session/Meta/Images.xcassets/disappearing_message_45.imageset/timer45_12@1x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_45.imageset/timer45_12@1x.png rename to Session/Meta/Images.xcassets/disappearing_message_45.imageset/timer45_12@1x.png diff --git a/Session/Images.xcassets/disappearing_message_45.imageset/timer45_12@2x.png b/Session/Meta/Images.xcassets/disappearing_message_45.imageset/timer45_12@2x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_45.imageset/timer45_12@2x.png rename to Session/Meta/Images.xcassets/disappearing_message_45.imageset/timer45_12@2x.png diff --git a/Session/Images.xcassets/disappearing_message_45.imageset/timer45_12@3x.png b/Session/Meta/Images.xcassets/disappearing_message_45.imageset/timer45_12@3x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_45.imageset/timer45_12@3x.png rename to Session/Meta/Images.xcassets/disappearing_message_45.imageset/timer45_12@3x.png diff --git a/Session/Images.xcassets/disappearing_message_50.imageset/Contents.json b/Session/Meta/Images.xcassets/disappearing_message_50.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/disappearing_message_50.imageset/Contents.json rename to Session/Meta/Images.xcassets/disappearing_message_50.imageset/Contents.json diff --git a/Session/Images.xcassets/disappearing_message_50.imageset/timer50_12@1x.png b/Session/Meta/Images.xcassets/disappearing_message_50.imageset/timer50_12@1x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_50.imageset/timer50_12@1x.png rename to Session/Meta/Images.xcassets/disappearing_message_50.imageset/timer50_12@1x.png diff --git a/Session/Images.xcassets/disappearing_message_50.imageset/timer50_12@2x.png b/Session/Meta/Images.xcassets/disappearing_message_50.imageset/timer50_12@2x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_50.imageset/timer50_12@2x.png rename to Session/Meta/Images.xcassets/disappearing_message_50.imageset/timer50_12@2x.png diff --git a/Session/Images.xcassets/disappearing_message_50.imageset/timer50_12@3x.png b/Session/Meta/Images.xcassets/disappearing_message_50.imageset/timer50_12@3x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_50.imageset/timer50_12@3x.png rename to Session/Meta/Images.xcassets/disappearing_message_50.imageset/timer50_12@3x.png diff --git a/Session/Images.xcassets/disappearing_message_55.imageset/Contents.json b/Session/Meta/Images.xcassets/disappearing_message_55.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/disappearing_message_55.imageset/Contents.json rename to Session/Meta/Images.xcassets/disappearing_message_55.imageset/Contents.json diff --git a/Session/Images.xcassets/disappearing_message_55.imageset/timer55_12@1x.png b/Session/Meta/Images.xcassets/disappearing_message_55.imageset/timer55_12@1x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_55.imageset/timer55_12@1x.png rename to Session/Meta/Images.xcassets/disappearing_message_55.imageset/timer55_12@1x.png diff --git a/Session/Images.xcassets/disappearing_message_55.imageset/timer55_12@2x.png b/Session/Meta/Images.xcassets/disappearing_message_55.imageset/timer55_12@2x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_55.imageset/timer55_12@2x.png rename to Session/Meta/Images.xcassets/disappearing_message_55.imageset/timer55_12@2x.png diff --git a/Session/Images.xcassets/disappearing_message_55.imageset/timer55_12@3x.png b/Session/Meta/Images.xcassets/disappearing_message_55.imageset/timer55_12@3x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_55.imageset/timer55_12@3x.png rename to Session/Meta/Images.xcassets/disappearing_message_55.imageset/timer55_12@3x.png diff --git a/Session/Images.xcassets/disappearing_message_60.imageset/Contents.json b/Session/Meta/Images.xcassets/disappearing_message_60.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/disappearing_message_60.imageset/Contents.json rename to Session/Meta/Images.xcassets/disappearing_message_60.imageset/Contents.json diff --git a/Session/Images.xcassets/disappearing_message_60.imageset/timer60_12@1x.png b/Session/Meta/Images.xcassets/disappearing_message_60.imageset/timer60_12@1x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_60.imageset/timer60_12@1x.png rename to Session/Meta/Images.xcassets/disappearing_message_60.imageset/timer60_12@1x.png diff --git a/Session/Images.xcassets/disappearing_message_60.imageset/timer60_12@2x.png b/Session/Meta/Images.xcassets/disappearing_message_60.imageset/timer60_12@2x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_60.imageset/timer60_12@2x.png rename to Session/Meta/Images.xcassets/disappearing_message_60.imageset/timer60_12@2x.png diff --git a/Session/Images.xcassets/disappearing_message_60.imageset/timer60_12@3x.png b/Session/Meta/Images.xcassets/disappearing_message_60.imageset/timer60_12@3x.png similarity index 100% rename from Session/Images.xcassets/disappearing_message_60.imageset/timer60_12@3x.png rename to Session/Meta/Images.xcassets/disappearing_message_60.imageset/timer60_12@3x.png diff --git a/Session/Images.xcassets/file-black-40.imageset/Contents.json b/Session/Meta/Images.xcassets/file-black-40.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/file-black-40.imageset/Contents.json rename to Session/Meta/Images.xcassets/file-black-40.imageset/Contents.json diff --git a/Session/Images.xcassets/file-black-40.imageset/file-black-40@1x.png b/Session/Meta/Images.xcassets/file-black-40.imageset/file-black-40@1x.png similarity index 100% rename from Session/Images.xcassets/file-black-40.imageset/file-black-40@1x.png rename to Session/Meta/Images.xcassets/file-black-40.imageset/file-black-40@1x.png diff --git a/Session/Images.xcassets/file-black-40.imageset/file-black-40@2x.png b/Session/Meta/Images.xcassets/file-black-40.imageset/file-black-40@2x.png similarity index 100% rename from Session/Images.xcassets/file-black-40.imageset/file-black-40@2x.png rename to Session/Meta/Images.xcassets/file-black-40.imageset/file-black-40@2x.png diff --git a/Session/Images.xcassets/file-black-40.imageset/file-black-40@3x.png b/Session/Meta/Images.xcassets/file-black-40.imageset/file-black-40@3x.png similarity index 100% rename from Session/Images.xcassets/file-black-40.imageset/file-black-40@3x.png rename to Session/Meta/Images.xcassets/file-black-40.imageset/file-black-40@3x.png diff --git a/Session/Images.xcassets/file-icon-large.imageset/Contents.json b/Session/Meta/Images.xcassets/file-icon-large.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/file-icon-large.imageset/Contents.json rename to Session/Meta/Images.xcassets/file-icon-large.imageset/Contents.json diff --git a/Session/Images.xcassets/file-icon-large.imageset/file-icon-large@1x.png b/Session/Meta/Images.xcassets/file-icon-large.imageset/file-icon-large@1x.png similarity index 100% rename from Session/Images.xcassets/file-icon-large.imageset/file-icon-large@1x.png rename to Session/Meta/Images.xcassets/file-icon-large.imageset/file-icon-large@1x.png diff --git a/Session/Images.xcassets/file-thin-black-filled-large.imageset/Contents.json b/Session/Meta/Images.xcassets/file-thin-black-filled-large.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/file-thin-black-filled-large.imageset/Contents.json rename to Session/Meta/Images.xcassets/file-thin-black-filled-large.imageset/Contents.json diff --git a/Session/Images.xcassets/file-thin-black-filled-large.imageset/file-thin-black-w-shadow-large.png b/Session/Meta/Images.xcassets/file-thin-black-filled-large.imageset/file-thin-black-w-shadow-large.png similarity index 100% rename from Session/Images.xcassets/file-thin-black-filled-large.imageset/file-thin-black-w-shadow-large.png rename to Session/Meta/Images.xcassets/file-thin-black-filled-large.imageset/file-thin-black-w-shadow-large.png diff --git a/Session/Images.xcassets/file-thin-black-large.imageset/Contents.json b/Session/Meta/Images.xcassets/file-thin-black-large.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/file-thin-black-large.imageset/Contents.json rename to Session/Meta/Images.xcassets/file-thin-black-large.imageset/Contents.json diff --git a/Session/Images.xcassets/file-thin-black-large.imageset/file-thin-black-large.png b/Session/Meta/Images.xcassets/file-thin-black-large.imageset/file-thin-black-large.png similarity index 100% rename from Session/Images.xcassets/file-thin-black-large.imageset/file-thin-black-large.png rename to Session/Meta/Images.xcassets/file-thin-black-large.imageset/file-thin-black-large.png diff --git a/Session/Images.xcassets/file-white-40.imageset/Contents.json b/Session/Meta/Images.xcassets/file-white-40.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/file-white-40.imageset/Contents.json rename to Session/Meta/Images.xcassets/file-white-40.imageset/Contents.json diff --git a/Session/Images.xcassets/file-white-40.imageset/file-white-40@1x.png b/Session/Meta/Images.xcassets/file-white-40.imageset/file-white-40@1x.png similarity index 100% rename from Session/Images.xcassets/file-white-40.imageset/file-white-40@1x.png rename to Session/Meta/Images.xcassets/file-white-40.imageset/file-white-40@1x.png diff --git a/Session/Images.xcassets/file-white-40.imageset/file-white-40@2x.png b/Session/Meta/Images.xcassets/file-white-40.imageset/file-white-40@2x.png similarity index 100% rename from Session/Images.xcassets/file-white-40.imageset/file-white-40@2x.png rename to Session/Meta/Images.xcassets/file-white-40.imageset/file-white-40@2x.png diff --git a/Session/Images.xcassets/file-white-40.imageset/file-white-40@3x.png b/Session/Meta/Images.xcassets/file-white-40.imageset/file-white-40@3x.png similarity index 100% rename from Session/Images.xcassets/file-white-40.imageset/file-white-40@3x.png rename to Session/Meta/Images.xcassets/file-white-40.imageset/file-white-40@3x.png diff --git a/Session/Images.xcassets/generic-attachment-small.imageset/Contents.json b/Session/Meta/Images.xcassets/generic-attachment-small.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/generic-attachment-small.imageset/Contents.json rename to Session/Meta/Images.xcassets/generic-attachment-small.imageset/Contents.json diff --git a/Session/Images.xcassets/generic-attachment-small.imageset/generic-attachment-small@1x.png b/Session/Meta/Images.xcassets/generic-attachment-small.imageset/generic-attachment-small@1x.png similarity index 100% rename from Session/Images.xcassets/generic-attachment-small.imageset/generic-attachment-small@1x.png rename to Session/Meta/Images.xcassets/generic-attachment-small.imageset/generic-attachment-small@1x.png diff --git a/Session/Images.xcassets/generic-attachment-small.imageset/generic-attachment-small@2x.png b/Session/Meta/Images.xcassets/generic-attachment-small.imageset/generic-attachment-small@2x.png similarity index 100% rename from Session/Images.xcassets/generic-attachment-small.imageset/generic-attachment-small@2x.png rename to Session/Meta/Images.xcassets/generic-attachment-small.imageset/generic-attachment-small@2x.png diff --git a/Session/Images.xcassets/generic-attachment-small.imageset/generic-attachment-small@3x.png b/Session/Meta/Images.xcassets/generic-attachment-small.imageset/generic-attachment-small@3x.png similarity index 100% rename from Session/Images.xcassets/generic-attachment-small.imageset/generic-attachment-small@3x.png rename to Session/Meta/Images.xcassets/generic-attachment-small.imageset/generic-attachment-small@3x.png diff --git a/Session/Images.xcassets/generic-attachment.imageset/Contents.json b/Session/Meta/Images.xcassets/generic-attachment.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/generic-attachment.imageset/Contents.json rename to Session/Meta/Images.xcassets/generic-attachment.imageset/Contents.json diff --git a/Session/Images.xcassets/generic-attachment.imageset/file-light-large@1x.png b/Session/Meta/Images.xcassets/generic-attachment.imageset/file-light-large@1x.png similarity index 100% rename from Session/Images.xcassets/generic-attachment.imageset/file-light-large@1x.png rename to Session/Meta/Images.xcassets/generic-attachment.imageset/file-light-large@1x.png diff --git a/Session/Images.xcassets/generic-attachment.imageset/file-light-large@2x.png b/Session/Meta/Images.xcassets/generic-attachment.imageset/file-light-large@2x.png similarity index 100% rename from Session/Images.xcassets/generic-attachment.imageset/file-light-large@2x.png rename to Session/Meta/Images.xcassets/generic-attachment.imageset/file-light-large@2x.png diff --git a/Session/Images.xcassets/generic-attachment.imageset/file-light-large@3x.png b/Session/Meta/Images.xcassets/generic-attachment.imageset/file-light-large@3x.png similarity index 100% rename from Session/Images.xcassets/generic-attachment.imageset/file-light-large@3x.png rename to Session/Meta/Images.xcassets/generic-attachment.imageset/file-light-large@3x.png diff --git a/Session/Images.xcassets/giphy_logo.imageset/Contents.json b/Session/Meta/Images.xcassets/giphy_logo.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/giphy_logo.imageset/Contents.json rename to Session/Meta/Images.xcassets/giphy_logo.imageset/Contents.json diff --git a/Session/Images.xcassets/giphy_logo.imageset/giphy_logo_2@1x.png b/Session/Meta/Images.xcassets/giphy_logo.imageset/giphy_logo_2@1x.png similarity index 100% rename from Session/Images.xcassets/giphy_logo.imageset/giphy_logo_2@1x.png rename to Session/Meta/Images.xcassets/giphy_logo.imageset/giphy_logo_2@1x.png diff --git a/Session/Images.xcassets/giphy_logo.imageset/giphy_logo_2@2x.png b/Session/Meta/Images.xcassets/giphy_logo.imageset/giphy_logo_2@2x.png similarity index 100% rename from Session/Images.xcassets/giphy_logo.imageset/giphy_logo_2@2x.png rename to Session/Meta/Images.xcassets/giphy_logo.imageset/giphy_logo_2@2x.png diff --git a/Session/Images.xcassets/giphy_logo.imageset/giphy_logo_2@3x.png b/Session/Meta/Images.xcassets/giphy_logo.imageset/giphy_logo_2@3x.png similarity index 100% rename from Session/Images.xcassets/giphy_logo.imageset/giphy_logo_2@3x.png rename to Session/Meta/Images.xcassets/giphy_logo.imageset/giphy_logo_2@3x.png diff --git a/Session/Images.xcassets/group-avatar.imageset/Contents.json b/Session/Meta/Images.xcassets/group-avatar.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/group-avatar.imageset/Contents.json rename to Session/Meta/Images.xcassets/group-avatar.imageset/Contents.json diff --git a/Session/Images.xcassets/group-avatar.imageset/group-28-white@1x.png b/Session/Meta/Images.xcassets/group-avatar.imageset/group-28-white@1x.png similarity index 100% rename from Session/Images.xcassets/group-avatar.imageset/group-28-white@1x.png rename to Session/Meta/Images.xcassets/group-avatar.imageset/group-28-white@1x.png diff --git a/Session/Images.xcassets/group-avatar.imageset/group-28-white@2x.png b/Session/Meta/Images.xcassets/group-avatar.imageset/group-28-white@2x.png similarity index 100% rename from Session/Images.xcassets/group-avatar.imageset/group-28-white@2x.png rename to Session/Meta/Images.xcassets/group-avatar.imageset/group-28-white@2x.png diff --git a/Session/Images.xcassets/group-avatar.imageset/group-28-white@3x.png b/Session/Meta/Images.xcassets/group-avatar.imageset/group-28-white@3x.png similarity index 100% rename from Session/Images.xcassets/group-avatar.imageset/group-28-white@3x.png rename to Session/Meta/Images.xcassets/group-avatar.imageset/group-28-white@3x.png diff --git a/Session/Images.xcassets/hangup-active-wide.imageset/Contents.json b/Session/Meta/Images.xcassets/hangup-active-wide.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/hangup-active-wide.imageset/Contents.json rename to Session/Meta/Images.xcassets/hangup-active-wide.imageset/Contents.json diff --git a/Session/Images.xcassets/hangup-active-wide.imageset/hangup-active-wide.png b/Session/Meta/Images.xcassets/hangup-active-wide.imageset/hangup-active-wide.png similarity index 100% rename from Session/Images.xcassets/hangup-active-wide.imageset/hangup-active-wide.png rename to Session/Meta/Images.xcassets/hangup-active-wide.imageset/hangup-active-wide.png diff --git a/Session/Images.xcassets/home_empty_splash_1.imageset/Contents.json b/Session/Meta/Images.xcassets/home_empty_splash_1.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/home_empty_splash_1.imageset/Contents.json rename to Session/Meta/Images.xcassets/home_empty_splash_1.imageset/Contents.json diff --git a/Session/Images.xcassets/home_empty_splash_1.imageset/human-1@3x.png b/Session/Meta/Images.xcassets/home_empty_splash_1.imageset/human-1@3x.png similarity index 100% rename from Session/Images.xcassets/home_empty_splash_1.imageset/human-1@3x.png rename to Session/Meta/Images.xcassets/home_empty_splash_1.imageset/human-1@3x.png diff --git a/Session/Images.xcassets/home_empty_splash_2.imageset/Contents.json b/Session/Meta/Images.xcassets/home_empty_splash_2.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/home_empty_splash_2.imageset/Contents.json rename to Session/Meta/Images.xcassets/home_empty_splash_2.imageset/Contents.json diff --git a/Session/Images.xcassets/home_empty_splash_2.imageset/human-2@3x.png b/Session/Meta/Images.xcassets/home_empty_splash_2.imageset/human-2@3x.png similarity index 100% rename from Session/Images.xcassets/home_empty_splash_2.imageset/human-2@3x.png rename to Session/Meta/Images.xcassets/home_empty_splash_2.imageset/human-2@3x.png diff --git a/Session/Images.xcassets/home_empty_splash_3.imageset/Contents.json b/Session/Meta/Images.xcassets/home_empty_splash_3.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/home_empty_splash_3.imageset/Contents.json rename to Session/Meta/Images.xcassets/home_empty_splash_3.imageset/Contents.json diff --git a/Session/Images.xcassets/home_empty_splash_3.imageset/human-3@3x.png b/Session/Meta/Images.xcassets/home_empty_splash_3.imageset/human-3@3x.png similarity index 100% rename from Session/Images.xcassets/home_empty_splash_3.imageset/human-3@3x.png rename to Session/Meta/Images.xcassets/home_empty_splash_3.imageset/human-3@3x.png diff --git a/Session/Images.xcassets/home_empty_splash_4.imageset/Contents.json b/Session/Meta/Images.xcassets/home_empty_splash_4.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/home_empty_splash_4.imageset/Contents.json rename to Session/Meta/Images.xcassets/home_empty_splash_4.imageset/Contents.json diff --git a/Session/Images.xcassets/home_empty_splash_4.imageset/human-4@3x.png b/Session/Meta/Images.xcassets/home_empty_splash_4.imageset/human-4@3x.png similarity index 100% rename from Session/Images.xcassets/home_empty_splash_4.imageset/human-4@3x.png rename to Session/Meta/Images.xcassets/home_empty_splash_4.imageset/human-4@3x.png diff --git a/Session/Images.xcassets/home_empty_splash_5.imageset/Contents.json b/Session/Meta/Images.xcassets/home_empty_splash_5.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/home_empty_splash_5.imageset/Contents.json rename to Session/Meta/Images.xcassets/home_empty_splash_5.imageset/Contents.json diff --git a/Session/Images.xcassets/home_empty_splash_5.imageset/human-5@3x.png b/Session/Meta/Images.xcassets/home_empty_splash_5.imageset/human-5@3x.png similarity index 100% rename from Session/Images.xcassets/home_empty_splash_5.imageset/human-5@3x.png rename to Session/Meta/Images.xcassets/home_empty_splash_5.imageset/human-5@3x.png diff --git a/Session/Images.xcassets/ic_add_caption.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_add_caption.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_add_caption.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_add_caption.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_add_caption.imageset/add-caption-24@1x.png b/Session/Meta/Images.xcassets/ic_add_caption.imageset/add-caption-24@1x.png similarity index 100% rename from Session/Images.xcassets/ic_add_caption.imageset/add-caption-24@1x.png rename to Session/Meta/Images.xcassets/ic_add_caption.imageset/add-caption-24@1x.png diff --git a/Session/Images.xcassets/ic_add_caption.imageset/add-caption-24@2x.png b/Session/Meta/Images.xcassets/ic_add_caption.imageset/add-caption-24@2x.png similarity index 100% rename from Session/Images.xcassets/ic_add_caption.imageset/add-caption-24@2x.png rename to Session/Meta/Images.xcassets/ic_add_caption.imageset/add-caption-24@2x.png diff --git a/Session/Images.xcassets/ic_add_caption.imageset/add-caption-24@3x.png b/Session/Meta/Images.xcassets/ic_add_caption.imageset/add-caption-24@3x.png similarity index 100% rename from Session/Images.xcassets/ic_add_caption.imageset/add-caption-24@3x.png rename to Session/Meta/Images.xcassets/ic_add_caption.imageset/add-caption-24@3x.png diff --git a/Session/Images.xcassets/ic_block.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_block.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_block.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_block.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_block.imageset/ic_block@1x.png b/Session/Meta/Images.xcassets/ic_block.imageset/ic_block@1x.png similarity index 100% rename from Session/Images.xcassets/ic_block.imageset/ic_block@1x.png rename to Session/Meta/Images.xcassets/ic_block.imageset/ic_block@1x.png diff --git a/Session/Images.xcassets/ic_block.imageset/ic_block@2x.png b/Session/Meta/Images.xcassets/ic_block.imageset/ic_block@2x.png similarity index 100% rename from Session/Images.xcassets/ic_block.imageset/ic_block@2x.png rename to Session/Meta/Images.xcassets/ic_block.imageset/ic_block@2x.png diff --git a/Session/Images.xcassets/ic_block.imageset/ic_block@3x.png b/Session/Meta/Images.xcassets/ic_block.imageset/ic_block@3x.png similarity index 100% rename from Session/Images.xcassets/ic_block.imageset/ic_block@3x.png rename to Session/Meta/Images.xcassets/ic_block.imageset/ic_block@3x.png diff --git a/Session/Images.xcassets/ic_broken_link.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_broken_link.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_broken_link.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_broken_link.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_broken_link.imageset/broken-link-16@1x.png b/Session/Meta/Images.xcassets/ic_broken_link.imageset/broken-link-16@1x.png similarity index 100% rename from Session/Images.xcassets/ic_broken_link.imageset/broken-link-16@1x.png rename to Session/Meta/Images.xcassets/ic_broken_link.imageset/broken-link-16@1x.png diff --git a/Session/Images.xcassets/ic_broken_link.imageset/broken-link-16@2x.png b/Session/Meta/Images.xcassets/ic_broken_link.imageset/broken-link-16@2x.png similarity index 100% rename from Session/Images.xcassets/ic_broken_link.imageset/broken-link-16@2x.png rename to Session/Meta/Images.xcassets/ic_broken_link.imageset/broken-link-16@2x.png diff --git a/Session/Images.xcassets/ic_broken_link.imageset/broken-link-16@3x.png b/Session/Meta/Images.xcassets/ic_broken_link.imageset/broken-link-16@3x.png similarity index 100% rename from Session/Images.xcassets/ic_broken_link.imageset/broken-link-16@3x.png rename to Session/Meta/Images.xcassets/ic_broken_link.imageset/broken-link-16@3x.png diff --git a/Session/Images.xcassets/ic_chevron_down.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_chevron_down.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_chevron_down.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_chevron_down.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_chevron_down.imageset/chevron-down-24@1x.png b/Session/Meta/Images.xcassets/ic_chevron_down.imageset/chevron-down-24@1x.png similarity index 100% rename from Session/Images.xcassets/ic_chevron_down.imageset/chevron-down-24@1x.png rename to Session/Meta/Images.xcassets/ic_chevron_down.imageset/chevron-down-24@1x.png diff --git a/Session/Images.xcassets/ic_chevron_down.imageset/chevron-down-24@2x.png b/Session/Meta/Images.xcassets/ic_chevron_down.imageset/chevron-down-24@2x.png similarity index 100% rename from Session/Images.xcassets/ic_chevron_down.imageset/chevron-down-24@2x.png rename to Session/Meta/Images.xcassets/ic_chevron_down.imageset/chevron-down-24@2x.png diff --git a/Session/Images.xcassets/ic_chevron_down.imageset/chevron-down-24@3x.png b/Session/Meta/Images.xcassets/ic_chevron_down.imageset/chevron-down-24@3x.png similarity index 100% rename from Session/Images.xcassets/ic_chevron_down.imageset/chevron-down-24@3x.png rename to Session/Meta/Images.xcassets/ic_chevron_down.imageset/chevron-down-24@3x.png diff --git a/Session/Images.xcassets/ic_chevron_up.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_chevron_up.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_chevron_up.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_chevron_up.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_chevron_up.imageset/chevron-up-24@1x.png b/Session/Meta/Images.xcassets/ic_chevron_up.imageset/chevron-up-24@1x.png similarity index 100% rename from Session/Images.xcassets/ic_chevron_up.imageset/chevron-up-24@1x.png rename to Session/Meta/Images.xcassets/ic_chevron_up.imageset/chevron-up-24@1x.png diff --git a/Session/Images.xcassets/ic_chevron_up.imageset/chevron-up-24@2x.png b/Session/Meta/Images.xcassets/ic_chevron_up.imageset/chevron-up-24@2x.png similarity index 100% rename from Session/Images.xcassets/ic_chevron_up.imageset/chevron-up-24@2x.png rename to Session/Meta/Images.xcassets/ic_chevron_up.imageset/chevron-up-24@2x.png diff --git a/Session/Images.xcassets/ic_chevron_up.imageset/chevron-up-24@3x.png b/Session/Meta/Images.xcassets/ic_chevron_up.imageset/chevron-up-24@3x.png similarity index 100% rename from Session/Images.xcassets/ic_chevron_up.imageset/chevron-up-24@3x.png rename to Session/Meta/Images.xcassets/ic_chevron_up.imageset/chevron-up-24@3x.png diff --git a/Session/Images.xcassets/ic_circled_plus.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_circled_plus.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_circled_plus.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_circled_plus.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_circled_plus.imageset/UIRemoveControlPlus_22x22_@1x.png b/Session/Meta/Images.xcassets/ic_circled_plus.imageset/UIRemoveControlPlus_22x22_@1x.png similarity index 100% rename from Session/Images.xcassets/ic_circled_plus.imageset/UIRemoveControlPlus_22x22_@1x.png rename to Session/Meta/Images.xcassets/ic_circled_plus.imageset/UIRemoveControlPlus_22x22_@1x.png diff --git a/Session/Images.xcassets/ic_circled_plus.imageset/UIRemoveControlPlus_22x22_@2x.png b/Session/Meta/Images.xcassets/ic_circled_plus.imageset/UIRemoveControlPlus_22x22_@2x.png similarity index 100% rename from Session/Images.xcassets/ic_circled_plus.imageset/UIRemoveControlPlus_22x22_@2x.png rename to Session/Meta/Images.xcassets/ic_circled_plus.imageset/UIRemoveControlPlus_22x22_@2x.png diff --git a/Session/Images.xcassets/ic_circled_plus.imageset/UIRemoveControlPlus_22x22_@3x.png b/Session/Meta/Images.xcassets/ic_circled_plus.imageset/UIRemoveControlPlus_22x22_@3x.png similarity index 100% rename from Session/Images.xcassets/ic_circled_plus.imageset/UIRemoveControlPlus_22x22_@3x.png rename to Session/Meta/Images.xcassets/ic_circled_plus.imageset/UIRemoveControlPlus_22x22_@3x.png diff --git a/Session/Images.xcassets/ic_circled_x.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_circled_x.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_circled_x.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_circled_x.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@1x.png b/Session/Meta/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@1x.png similarity index 100% rename from Session/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@1x.png rename to Session/Meta/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@1x.png diff --git a/Session/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@2x.png b/Session/Meta/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@2x.png similarity index 100% rename from Session/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@2x.png rename to Session/Meta/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@2x.png diff --git a/Session/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@3x.png b/Session/Meta/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@3x.png similarity index 100% rename from Session/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@3x.png rename to Session/Meta/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@3x.png diff --git a/Session/Images.xcassets/ic_color_palette.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_color_palette.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_color_palette.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_color_palette.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_color_palette.imageset/color-palette-24@1x.png b/Session/Meta/Images.xcassets/ic_color_palette.imageset/color-palette-24@1x.png similarity index 100% rename from Session/Images.xcassets/ic_color_palette.imageset/color-palette-24@1x.png rename to Session/Meta/Images.xcassets/ic_color_palette.imageset/color-palette-24@1x.png diff --git a/Session/Images.xcassets/ic_color_palette.imageset/color-palette-24@2x.png b/Session/Meta/Images.xcassets/ic_color_palette.imageset/color-palette-24@2x.png similarity index 100% rename from Session/Images.xcassets/ic_color_palette.imageset/color-palette-24@2x.png rename to Session/Meta/Images.xcassets/ic_color_palette.imageset/color-palette-24@2x.png diff --git a/Session/Images.xcassets/ic_color_palette.imageset/color-palette-24@3x.png b/Session/Meta/Images.xcassets/ic_color_palette.imageset/color-palette-24@3x.png similarity index 100% rename from Session/Images.xcassets/ic_color_palette.imageset/color-palette-24@3x.png rename to Session/Meta/Images.xcassets/ic_color_palette.imageset/color-palette-24@3x.png diff --git a/Session/Images.xcassets/ic_copy.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_copy.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_copy.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_copy.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_copy.imageset/Copy-24@1x.png b/Session/Meta/Images.xcassets/ic_copy.imageset/Copy-24@1x.png similarity index 100% rename from Session/Images.xcassets/ic_copy.imageset/Copy-24@1x.png rename to Session/Meta/Images.xcassets/ic_copy.imageset/Copy-24@1x.png diff --git a/Session/Images.xcassets/ic_copy.imageset/Copy-24@2x.png b/Session/Meta/Images.xcassets/ic_copy.imageset/Copy-24@2x.png similarity index 100% rename from Session/Images.xcassets/ic_copy.imageset/Copy-24@2x.png rename to Session/Meta/Images.xcassets/ic_copy.imageset/Copy-24@2x.png diff --git a/Session/Images.xcassets/ic_copy.imageset/Copy-24@3x.png b/Session/Meta/Images.xcassets/ic_copy.imageset/Copy-24@3x.png similarity index 100% rename from Session/Images.xcassets/ic_copy.imageset/Copy-24@3x.png rename to Session/Meta/Images.xcassets/ic_copy.imageset/Copy-24@3x.png diff --git a/Session/Images.xcassets/ic_dark_theme_off.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_dark_theme_off.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_dark_theme_off.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_dark_theme_off.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_dark_theme_off.imageset/dark-theme-off-24@1x.png b/Session/Meta/Images.xcassets/ic_dark_theme_off.imageset/dark-theme-off-24@1x.png similarity index 100% rename from Session/Images.xcassets/ic_dark_theme_off.imageset/dark-theme-off-24@1x.png rename to Session/Meta/Images.xcassets/ic_dark_theme_off.imageset/dark-theme-off-24@1x.png diff --git a/Session/Images.xcassets/ic_dark_theme_off.imageset/dark-theme-off-24@2x.png b/Session/Meta/Images.xcassets/ic_dark_theme_off.imageset/dark-theme-off-24@2x.png similarity index 100% rename from Session/Images.xcassets/ic_dark_theme_off.imageset/dark-theme-off-24@2x.png rename to Session/Meta/Images.xcassets/ic_dark_theme_off.imageset/dark-theme-off-24@2x.png diff --git a/Session/Images.xcassets/ic_dark_theme_off.imageset/dark-theme-off-24@3x.png b/Session/Meta/Images.xcassets/ic_dark_theme_off.imageset/dark-theme-off-24@3x.png similarity index 100% rename from Session/Images.xcassets/ic_dark_theme_off.imageset/dark-theme-off-24@3x.png rename to Session/Meta/Images.xcassets/ic_dark_theme_off.imageset/dark-theme-off-24@3x.png diff --git a/Session/Images.xcassets/ic_dark_theme_on.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_dark_theme_on.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_dark_theme_on.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_dark_theme_on.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_dark_theme_on.imageset/dark-theme-on-24@1x.png b/Session/Meta/Images.xcassets/ic_dark_theme_on.imageset/dark-theme-on-24@1x.png similarity index 100% rename from Session/Images.xcassets/ic_dark_theme_on.imageset/dark-theme-on-24@1x.png rename to Session/Meta/Images.xcassets/ic_dark_theme_on.imageset/dark-theme-on-24@1x.png diff --git a/Session/Images.xcassets/ic_dark_theme_on.imageset/dark-theme-on-24@2x.png b/Session/Meta/Images.xcassets/ic_dark_theme_on.imageset/dark-theme-on-24@2x.png similarity index 100% rename from Session/Images.xcassets/ic_dark_theme_on.imageset/dark-theme-on-24@2x.png rename to Session/Meta/Images.xcassets/ic_dark_theme_on.imageset/dark-theme-on-24@2x.png diff --git a/Session/Images.xcassets/ic_dark_theme_on.imageset/dark-theme-on-24@3x.png b/Session/Meta/Images.xcassets/ic_dark_theme_on.imageset/dark-theme-on-24@3x.png similarity index 100% rename from Session/Images.xcassets/ic_dark_theme_on.imageset/dark-theme-on-24@3x.png rename to Session/Meta/Images.xcassets/ic_dark_theme_on.imageset/dark-theme-on-24@3x.png diff --git a/Session/Images.xcassets/ic_devices_ios.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_devices_ios.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_devices_ios.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_devices_ios.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_devices_ios.imageset/ic_devices_ios.png b/Session/Meta/Images.xcassets/ic_devices_ios.imageset/ic_devices_ios.png similarity index 100% rename from Session/Images.xcassets/ic_devices_ios.imageset/ic_devices_ios.png rename to Session/Meta/Images.xcassets/ic_devices_ios.imageset/ic_devices_ios.png diff --git a/Session/Images.xcassets/ic_devices_ios.imageset/ic_devices_ios@2x.png b/Session/Meta/Images.xcassets/ic_devices_ios.imageset/ic_devices_ios@2x.png similarity index 100% rename from Session/Images.xcassets/ic_devices_ios.imageset/ic_devices_ios@2x.png rename to Session/Meta/Images.xcassets/ic_devices_ios.imageset/ic_devices_ios@2x.png diff --git a/Session/Images.xcassets/ic_devices_ios.imageset/ic_devices_ios@3x.png b/Session/Meta/Images.xcassets/ic_devices_ios.imageset/ic_devices_ios@3x.png similarity index 100% rename from Session/Images.xcassets/ic_devices_ios.imageset/ic_devices_ios@3x.png rename to Session/Meta/Images.xcassets/ic_devices_ios.imageset/ic_devices_ios@3x.png diff --git a/Session/Images.xcassets/ic_download.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_download.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_download.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_download.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_download.imageset/download-24@1x.png b/Session/Meta/Images.xcassets/ic_download.imageset/download-24@1x.png similarity index 100% rename from Session/Images.xcassets/ic_download.imageset/download-24@1x.png rename to Session/Meta/Images.xcassets/ic_download.imageset/download-24@1x.png diff --git a/Session/Images.xcassets/ic_download.imageset/download-24@2x.png b/Session/Meta/Images.xcassets/ic_download.imageset/download-24@2x.png similarity index 100% rename from Session/Images.xcassets/ic_download.imageset/download-24@2x.png rename to Session/Meta/Images.xcassets/ic_download.imageset/download-24@2x.png diff --git a/Session/Images.xcassets/ic_download.imageset/download-24@3x.png b/Session/Meta/Images.xcassets/ic_download.imageset/download-24@3x.png similarity index 100% rename from Session/Images.xcassets/ic_download.imageset/download-24@3x.png rename to Session/Meta/Images.xcassets/ic_download.imageset/download-24@3x.png diff --git a/Session/Images.xcassets/ic_flash_mode_auto.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_flash_mode_auto.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_flash_mode_auto.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_flash_mode_auto.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_flash_mode_auto.imageset/flash-auto-32@1x.png b/Session/Meta/Images.xcassets/ic_flash_mode_auto.imageset/flash-auto-32@1x.png similarity index 100% rename from Session/Images.xcassets/ic_flash_mode_auto.imageset/flash-auto-32@1x.png rename to Session/Meta/Images.xcassets/ic_flash_mode_auto.imageset/flash-auto-32@1x.png diff --git a/Session/Images.xcassets/ic_flash_mode_auto.imageset/flash-auto-32@2x.png b/Session/Meta/Images.xcassets/ic_flash_mode_auto.imageset/flash-auto-32@2x.png similarity index 100% rename from Session/Images.xcassets/ic_flash_mode_auto.imageset/flash-auto-32@2x.png rename to Session/Meta/Images.xcassets/ic_flash_mode_auto.imageset/flash-auto-32@2x.png diff --git a/Session/Images.xcassets/ic_flash_mode_auto.imageset/flash-auto-32@3x.png b/Session/Meta/Images.xcassets/ic_flash_mode_auto.imageset/flash-auto-32@3x.png similarity index 100% rename from Session/Images.xcassets/ic_flash_mode_auto.imageset/flash-auto-32@3x.png rename to Session/Meta/Images.xcassets/ic_flash_mode_auto.imageset/flash-auto-32@3x.png diff --git a/Session/Images.xcassets/ic_flash_mode_off.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_flash_mode_off.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_flash_mode_off.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_flash_mode_off.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_flash_mode_off.imageset/flash-off-32@1x.png b/Session/Meta/Images.xcassets/ic_flash_mode_off.imageset/flash-off-32@1x.png similarity index 100% rename from Session/Images.xcassets/ic_flash_mode_off.imageset/flash-off-32@1x.png rename to Session/Meta/Images.xcassets/ic_flash_mode_off.imageset/flash-off-32@1x.png diff --git a/Session/Images.xcassets/ic_flash_mode_off.imageset/flash-off-32@2x.png b/Session/Meta/Images.xcassets/ic_flash_mode_off.imageset/flash-off-32@2x.png similarity index 100% rename from Session/Images.xcassets/ic_flash_mode_off.imageset/flash-off-32@2x.png rename to Session/Meta/Images.xcassets/ic_flash_mode_off.imageset/flash-off-32@2x.png diff --git a/Session/Images.xcassets/ic_flash_mode_off.imageset/flash-off-32@3x.png b/Session/Meta/Images.xcassets/ic_flash_mode_off.imageset/flash-off-32@3x.png similarity index 100% rename from Session/Images.xcassets/ic_flash_mode_off.imageset/flash-off-32@3x.png rename to Session/Meta/Images.xcassets/ic_flash_mode_off.imageset/flash-off-32@3x.png diff --git a/Session/Images.xcassets/ic_flash_mode_on.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_flash_mode_on.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_flash_mode_on.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_flash_mode_on.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_flash_mode_on.imageset/flash-on-32@1x.png b/Session/Meta/Images.xcassets/ic_flash_mode_on.imageset/flash-on-32@1x.png similarity index 100% rename from Session/Images.xcassets/ic_flash_mode_on.imageset/flash-on-32@1x.png rename to Session/Meta/Images.xcassets/ic_flash_mode_on.imageset/flash-on-32@1x.png diff --git a/Session/Images.xcassets/ic_flash_mode_on.imageset/flash-on-32@2x.png b/Session/Meta/Images.xcassets/ic_flash_mode_on.imageset/flash-on-32@2x.png similarity index 100% rename from Session/Images.xcassets/ic_flash_mode_on.imageset/flash-on-32@2x.png rename to Session/Meta/Images.xcassets/ic_flash_mode_on.imageset/flash-on-32@2x.png diff --git a/Session/Images.xcassets/ic_flash_mode_on.imageset/flash-on-32@3x.png b/Session/Meta/Images.xcassets/ic_flash_mode_on.imageset/flash-on-32@3x.png similarity index 100% rename from Session/Images.xcassets/ic_flash_mode_on.imageset/flash-on-32@3x.png rename to Session/Meta/Images.xcassets/ic_flash_mode_on.imageset/flash-on-32@3x.png diff --git a/Session/Images.xcassets/ic_gallery_badge_gif.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_gallery_badge_gif.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_gallery_badge_gif.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_gallery_badge_gif.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_gallery_badge_gif.imageset/icon_GIF@1x.png b/Session/Meta/Images.xcassets/ic_gallery_badge_gif.imageset/icon_GIF@1x.png similarity index 100% rename from Session/Images.xcassets/ic_gallery_badge_gif.imageset/icon_GIF@1x.png rename to Session/Meta/Images.xcassets/ic_gallery_badge_gif.imageset/icon_GIF@1x.png diff --git a/Session/Images.xcassets/ic_gallery_badge_gif.imageset/icon_GIF@2x.png b/Session/Meta/Images.xcassets/ic_gallery_badge_gif.imageset/icon_GIF@2x.png similarity index 100% rename from Session/Images.xcassets/ic_gallery_badge_gif.imageset/icon_GIF@2x.png rename to Session/Meta/Images.xcassets/ic_gallery_badge_gif.imageset/icon_GIF@2x.png diff --git a/Session/Images.xcassets/ic_gallery_badge_gif.imageset/icon_GIF@3x.png b/Session/Meta/Images.xcassets/ic_gallery_badge_gif.imageset/icon_GIF@3x.png similarity index 100% rename from Session/Images.xcassets/ic_gallery_badge_gif.imageset/icon_GIF@3x.png rename to Session/Meta/Images.xcassets/ic_gallery_badge_gif.imageset/icon_GIF@3x.png diff --git a/Session/Images.xcassets/ic_gallery_badge_video.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_gallery_badge_video.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_gallery_badge_video.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_gallery_badge_video.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_gallery_badge_video.imageset/icon_video@1x.png b/Session/Meta/Images.xcassets/ic_gallery_badge_video.imageset/icon_video@1x.png similarity index 100% rename from Session/Images.xcassets/ic_gallery_badge_video.imageset/icon_video@1x.png rename to Session/Meta/Images.xcassets/ic_gallery_badge_video.imageset/icon_video@1x.png diff --git a/Session/Images.xcassets/ic_gallery_badge_video.imageset/icon_video@2x.png b/Session/Meta/Images.xcassets/ic_gallery_badge_video.imageset/icon_video@2x.png similarity index 100% rename from Session/Images.xcassets/ic_gallery_badge_video.imageset/icon_video@2x.png rename to Session/Meta/Images.xcassets/ic_gallery_badge_video.imageset/icon_video@2x.png diff --git a/Session/Images.xcassets/ic_gallery_badge_video.imageset/icon_video@3x.png b/Session/Meta/Images.xcassets/ic_gallery_badge_video.imageset/icon_video@3x.png similarity index 100% rename from Session/Images.xcassets/ic_gallery_badge_video.imageset/icon_video@3x.png rename to Session/Meta/Images.xcassets/ic_gallery_badge_video.imageset/icon_video@3x.png diff --git a/Session/Images.xcassets/ic_info.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_info.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_info.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_info.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_info.imageset/info-24@1x.png b/Session/Meta/Images.xcassets/ic_info.imageset/info-24@1x.png similarity index 100% rename from Session/Images.xcassets/ic_info.imageset/info-24@1x.png rename to Session/Meta/Images.xcassets/ic_info.imageset/info-24@1x.png diff --git a/Session/Images.xcassets/ic_info.imageset/info-24@2x.png b/Session/Meta/Images.xcassets/ic_info.imageset/info-24@2x.png similarity index 100% rename from Session/Images.xcassets/ic_info.imageset/info-24@2x.png rename to Session/Meta/Images.xcassets/ic_info.imageset/info-24@2x.png diff --git a/Session/Images.xcassets/ic_info.imageset/info-24@3x.png b/Session/Meta/Images.xcassets/ic_info.imageset/info-24@3x.png similarity index 100% rename from Session/Images.xcassets/ic_info.imageset/info-24@3x.png rename to Session/Meta/Images.xcassets/ic_info.imageset/info-24@3x.png diff --git a/Session/Images.xcassets/ic_lock_outline.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_lock_outline.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_lock_outline.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_lock_outline.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_lock_outline.imageset/ic_lock_outline_white.png b/Session/Meta/Images.xcassets/ic_lock_outline.imageset/ic_lock_outline_white.png similarity index 100% rename from Session/Images.xcassets/ic_lock_outline.imageset/ic_lock_outline_white.png rename to Session/Meta/Images.xcassets/ic_lock_outline.imageset/ic_lock_outline_white.png diff --git a/Session/Images.xcassets/ic_lock_outline.imageset/ic_lock_outline_white@2x.png b/Session/Meta/Images.xcassets/ic_lock_outline.imageset/ic_lock_outline_white@2x.png similarity index 100% rename from Session/Images.xcassets/ic_lock_outline.imageset/ic_lock_outline_white@2x.png rename to Session/Meta/Images.xcassets/ic_lock_outline.imageset/ic_lock_outline_white@2x.png diff --git a/Session/Images.xcassets/ic_lock_outline.imageset/ic_lock_outline_white@3x.png b/Session/Meta/Images.xcassets/ic_lock_outline.imageset/ic_lock_outline_white@3x.png similarity index 100% rename from Session/Images.xcassets/ic_lock_outline.imageset/ic_lock_outline_white@3x.png rename to Session/Meta/Images.xcassets/ic_lock_outline.imageset/ic_lock_outline_white@3x.png diff --git a/Session/Images.xcassets/ic_mute_thread.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_mute_thread.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_mute_thread.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_mute_thread.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_mute_thread.imageset/ic_mute_thread@1x.png b/Session/Meta/Images.xcassets/ic_mute_thread.imageset/ic_mute_thread@1x.png similarity index 100% rename from Session/Images.xcassets/ic_mute_thread.imageset/ic_mute_thread@1x.png rename to Session/Meta/Images.xcassets/ic_mute_thread.imageset/ic_mute_thread@1x.png diff --git a/Session/Images.xcassets/ic_mute_thread.imageset/ic_mute_thread@2x.png b/Session/Meta/Images.xcassets/ic_mute_thread.imageset/ic_mute_thread@2x.png similarity index 100% rename from Session/Images.xcassets/ic_mute_thread.imageset/ic_mute_thread@2x.png rename to Session/Meta/Images.xcassets/ic_mute_thread.imageset/ic_mute_thread@2x.png diff --git a/Session/Images.xcassets/ic_mute_thread.imageset/ic_mute_thread@3x.png b/Session/Meta/Images.xcassets/ic_mute_thread.imageset/ic_mute_thread@3x.png similarity index 100% rename from Session/Images.xcassets/ic_mute_thread.imageset/ic_mute_thread@3x.png rename to Session/Meta/Images.xcassets/ic_mute_thread.imageset/ic_mute_thread@3x.png diff --git a/Session/Images.xcassets/ic_plus_24.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_plus_24.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_plus_24.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_plus_24.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_plus_24.imageset/plus-24@1x.png b/Session/Meta/Images.xcassets/ic_plus_24.imageset/plus-24@1x.png similarity index 100% rename from Session/Images.xcassets/ic_plus_24.imageset/plus-24@1x.png rename to Session/Meta/Images.xcassets/ic_plus_24.imageset/plus-24@1x.png diff --git a/Session/Images.xcassets/ic_plus_24.imageset/plus-24@2x.png b/Session/Meta/Images.xcassets/ic_plus_24.imageset/plus-24@2x.png similarity index 100% rename from Session/Images.xcassets/ic_plus_24.imageset/plus-24@2x.png rename to Session/Meta/Images.xcassets/ic_plus_24.imageset/plus-24@2x.png diff --git a/Session/Images.xcassets/ic_plus_24.imageset/plus-24@3x.png b/Session/Meta/Images.xcassets/ic_plus_24.imageset/plus-24@3x.png similarity index 100% rename from Session/Images.xcassets/ic_plus_24.imageset/plus-24@3x.png rename to Session/Meta/Images.xcassets/ic_plus_24.imageset/plus-24@3x.png diff --git a/Session/Images.xcassets/ic_reply.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_reply.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_reply.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_reply.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_reply.imageset/reply-24@1x.png b/Session/Meta/Images.xcassets/ic_reply.imageset/reply-24@1x.png similarity index 100% rename from Session/Images.xcassets/ic_reply.imageset/reply-24@1x.png rename to Session/Meta/Images.xcassets/ic_reply.imageset/reply-24@1x.png diff --git a/Session/Images.xcassets/ic_reply.imageset/reply-24@2x.png b/Session/Meta/Images.xcassets/ic_reply.imageset/reply-24@2x.png similarity index 100% rename from Session/Images.xcassets/ic_reply.imageset/reply-24@2x.png rename to Session/Meta/Images.xcassets/ic_reply.imageset/reply-24@2x.png diff --git a/Session/Images.xcassets/ic_reply.imageset/reply-24@3x.png b/Session/Meta/Images.xcassets/ic_reply.imageset/reply-24@3x.png similarity index 100% rename from Session/Images.xcassets/ic_reply.imageset/reply-24@3x.png rename to Session/Meta/Images.xcassets/ic_reply.imageset/reply-24@3x.png diff --git a/Session/Images.xcassets/ic_secret_sender_indicator.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_secret_sender_indicator.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_secret_sender_indicator.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_secret_sender_indicator.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@1x.png b/Session/Meta/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@1x.png similarity index 100% rename from Session/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@1x.png rename to Session/Meta/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@1x.png diff --git a/Session/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@2x.png b/Session/Meta/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@2x.png similarity index 100% rename from Session/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@2x.png rename to Session/Meta/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@2x.png diff --git a/Session/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@3x.png b/Session/Meta/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@3x.png similarity index 100% rename from Session/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@3x.png rename to Session/Meta/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@3x.png diff --git a/Session/Images.xcassets/ic_speaker_bluetooth_inactive_audio_mode.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_speaker_bluetooth_inactive_audio_mode.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_speaker_bluetooth_inactive_audio_mode.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_speaker_bluetooth_inactive_audio_mode.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_speaker_bluetooth_inactive_audio_mode.imageset/ic_speaker_bluetooth_inactive_audio_mode.png b/Session/Meta/Images.xcassets/ic_speaker_bluetooth_inactive_audio_mode.imageset/ic_speaker_bluetooth_inactive_audio_mode.png similarity index 100% rename from Session/Images.xcassets/ic_speaker_bluetooth_inactive_audio_mode.imageset/ic_speaker_bluetooth_inactive_audio_mode.png rename to Session/Meta/Images.xcassets/ic_speaker_bluetooth_inactive_audio_mode.imageset/ic_speaker_bluetooth_inactive_audio_mode.png diff --git a/Session/Images.xcassets/ic_speaker_bluetooth_inactive_video_mode.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_speaker_bluetooth_inactive_video_mode.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_speaker_bluetooth_inactive_video_mode.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_speaker_bluetooth_inactive_video_mode.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_speaker_bluetooth_inactive_video_mode.imageset/ic_speaker_bluetooth_inactive_video_mode.png b/Session/Meta/Images.xcassets/ic_speaker_bluetooth_inactive_video_mode.imageset/ic_speaker_bluetooth_inactive_video_mode.png similarity index 100% rename from Session/Images.xcassets/ic_speaker_bluetooth_inactive_video_mode.imageset/ic_speaker_bluetooth_inactive_video_mode.png rename to Session/Meta/Images.xcassets/ic_speaker_bluetooth_inactive_video_mode.imageset/ic_speaker_bluetooth_inactive_video_mode.png diff --git a/Session/Images.xcassets/ic_switch_camera.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_switch_camera.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_switch_camera.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_switch_camera.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_switch_camera.imageset/switch-camera-32@1x.png b/Session/Meta/Images.xcassets/ic_switch_camera.imageset/switch-camera-32@1x.png similarity index 100% rename from Session/Images.xcassets/ic_switch_camera.imageset/switch-camera-32@1x.png rename to Session/Meta/Images.xcassets/ic_switch_camera.imageset/switch-camera-32@1x.png diff --git a/Session/Images.xcassets/ic_switch_camera.imageset/switch-camera-32@2x.png b/Session/Meta/Images.xcassets/ic_switch_camera.imageset/switch-camera-32@2x.png similarity index 100% rename from Session/Images.xcassets/ic_switch_camera.imageset/switch-camera-32@2x.png rename to Session/Meta/Images.xcassets/ic_switch_camera.imageset/switch-camera-32@2x.png diff --git a/Session/Images.xcassets/ic_switch_camera.imageset/switch-camera-32@3x.png b/Session/Meta/Images.xcassets/ic_switch_camera.imageset/switch-camera-32@3x.png similarity index 100% rename from Session/Images.xcassets/ic_switch_camera.imageset/switch-camera-32@3x.png rename to Session/Meta/Images.xcassets/ic_switch_camera.imageset/switch-camera-32@3x.png diff --git a/Session/Images.xcassets/ic_timer.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_timer.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_timer.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_timer.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_timer.imageset/timer-24@1x.png b/Session/Meta/Images.xcassets/ic_timer.imageset/timer-24@1x.png similarity index 100% rename from Session/Images.xcassets/ic_timer.imageset/timer-24@1x.png rename to Session/Meta/Images.xcassets/ic_timer.imageset/timer-24@1x.png diff --git a/Session/Images.xcassets/ic_timer.imageset/timer-24@2x.png b/Session/Meta/Images.xcassets/ic_timer.imageset/timer-24@2x.png similarity index 100% rename from Session/Images.xcassets/ic_timer.imageset/timer-24@2x.png rename to Session/Meta/Images.xcassets/ic_timer.imageset/timer-24@2x.png diff --git a/Session/Images.xcassets/ic_timer.imageset/timer-24@3x.png b/Session/Meta/Images.xcassets/ic_timer.imageset/timer-24@3x.png similarity index 100% rename from Session/Images.xcassets/ic_timer.imageset/timer-24@3x.png rename to Session/Meta/Images.xcassets/ic_timer.imageset/timer-24@3x.png diff --git a/Session/Images.xcassets/ic_timer_disabled.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_timer_disabled.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_timer_disabled.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_timer_disabled.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_timer_disabled.imageset/timer-disabled-24@1x.png b/Session/Meta/Images.xcassets/ic_timer_disabled.imageset/timer-disabled-24@1x.png similarity index 100% rename from Session/Images.xcassets/ic_timer_disabled.imageset/timer-disabled-24@1x.png rename to Session/Meta/Images.xcassets/ic_timer_disabled.imageset/timer-disabled-24@1x.png diff --git a/Session/Images.xcassets/ic_timer_disabled.imageset/timer-disabled-24@2x.png b/Session/Meta/Images.xcassets/ic_timer_disabled.imageset/timer-disabled-24@2x.png similarity index 100% rename from Session/Images.xcassets/ic_timer_disabled.imageset/timer-disabled-24@2x.png rename to Session/Meta/Images.xcassets/ic_timer_disabled.imageset/timer-disabled-24@2x.png diff --git a/Session/Images.xcassets/ic_timer_disabled.imageset/timer-disabled-24@3x.png b/Session/Meta/Images.xcassets/ic_timer_disabled.imageset/timer-disabled-24@3x.png similarity index 100% rename from Session/Images.xcassets/ic_timer_disabled.imageset/timer-disabled-24@3x.png rename to Session/Meta/Images.xcassets/ic_timer_disabled.imageset/timer-disabled-24@3x.png diff --git a/Session/Images.xcassets/ic_trash.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_trash.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_trash.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_trash.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_trash.imageset/trash-24@1x.png b/Session/Meta/Images.xcassets/ic_trash.imageset/trash-24@1x.png similarity index 100% rename from Session/Images.xcassets/ic_trash.imageset/trash-24@1x.png rename to Session/Meta/Images.xcassets/ic_trash.imageset/trash-24@1x.png diff --git a/Session/Images.xcassets/ic_trash.imageset/trash-24@2x.png b/Session/Meta/Images.xcassets/ic_trash.imageset/trash-24@2x.png similarity index 100% rename from Session/Images.xcassets/ic_trash.imageset/trash-24@2x.png rename to Session/Meta/Images.xcassets/ic_trash.imageset/trash-24@2x.png diff --git a/Session/Images.xcassets/ic_trash.imageset/trash-24@3x.png b/Session/Meta/Images.xcassets/ic_trash.imageset/trash-24@3x.png similarity index 100% rename from Session/Images.xcassets/ic_trash.imageset/trash-24@3x.png rename to Session/Meta/Images.xcassets/ic_trash.imageset/trash-24@3x.png diff --git a/Session/Images.xcassets/ic_x_with_shadow.imageset/Contents.json b/Session/Meta/Images.xcassets/ic_x_with_shadow.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/ic_x_with_shadow.imageset/Contents.json rename to Session/Meta/Images.xcassets/ic_x_with_shadow.imageset/Contents.json diff --git a/Session/Images.xcassets/ic_x_with_shadow.imageset/x-24@1x.png b/Session/Meta/Images.xcassets/ic_x_with_shadow.imageset/x-24@1x.png similarity index 100% rename from Session/Images.xcassets/ic_x_with_shadow.imageset/x-24@1x.png rename to Session/Meta/Images.xcassets/ic_x_with_shadow.imageset/x-24@1x.png diff --git a/Session/Images.xcassets/ic_x_with_shadow.imageset/x-24@2x.png b/Session/Meta/Images.xcassets/ic_x_with_shadow.imageset/x-24@2x.png similarity index 100% rename from Session/Images.xcassets/ic_x_with_shadow.imageset/x-24@2x.png rename to Session/Meta/Images.xcassets/ic_x_with_shadow.imageset/x-24@2x.png diff --git a/Session/Images.xcassets/ic_x_with_shadow.imageset/x-24@3x.png b/Session/Meta/Images.xcassets/ic_x_with_shadow.imageset/x-24@3x.png similarity index 100% rename from Session/Images.xcassets/ic_x_with_shadow.imageset/x-24@3x.png rename to Session/Meta/Images.xcassets/ic_x_with_shadow.imageset/x-24@3x.png diff --git a/Session/Images.xcassets/image_editor_brush.imageset/Contents.json b/Session/Meta/Images.xcassets/image_editor_brush.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/image_editor_brush.imageset/Contents.json rename to Session/Meta/Images.xcassets/image_editor_brush.imageset/Contents.json diff --git a/Session/Images.xcassets/image_editor_brush.imageset/marker-32@1x.png b/Session/Meta/Images.xcassets/image_editor_brush.imageset/marker-32@1x.png similarity index 100% rename from Session/Images.xcassets/image_editor_brush.imageset/marker-32@1x.png rename to Session/Meta/Images.xcassets/image_editor_brush.imageset/marker-32@1x.png diff --git a/Session/Images.xcassets/image_editor_brush.imageset/marker-32@2x.png b/Session/Meta/Images.xcassets/image_editor_brush.imageset/marker-32@2x.png similarity index 100% rename from Session/Images.xcassets/image_editor_brush.imageset/marker-32@2x.png rename to Session/Meta/Images.xcassets/image_editor_brush.imageset/marker-32@2x.png diff --git a/Session/Images.xcassets/image_editor_brush.imageset/marker-32@3x.png b/Session/Meta/Images.xcassets/image_editor_brush.imageset/marker-32@3x.png similarity index 100% rename from Session/Images.xcassets/image_editor_brush.imageset/marker-32@3x.png rename to Session/Meta/Images.xcassets/image_editor_brush.imageset/marker-32@3x.png diff --git a/Session/Images.xcassets/image_editor_caption.imageset/Contents.json b/Session/Meta/Images.xcassets/image_editor_caption.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/image_editor_caption.imageset/Contents.json rename to Session/Meta/Images.xcassets/image_editor_caption.imageset/Contents.json diff --git a/Session/Images.xcassets/image_editor_caption.imageset/caption-24@1x.png b/Session/Meta/Images.xcassets/image_editor_caption.imageset/caption-24@1x.png similarity index 100% rename from Session/Images.xcassets/image_editor_caption.imageset/caption-24@1x.png rename to Session/Meta/Images.xcassets/image_editor_caption.imageset/caption-24@1x.png diff --git a/Session/Images.xcassets/image_editor_caption.imageset/caption-24@2x.png b/Session/Meta/Images.xcassets/image_editor_caption.imageset/caption-24@2x.png similarity index 100% rename from Session/Images.xcassets/image_editor_caption.imageset/caption-24@2x.png rename to Session/Meta/Images.xcassets/image_editor_caption.imageset/caption-24@2x.png diff --git a/Session/Images.xcassets/image_editor_caption.imageset/caption-24@3x.png b/Session/Meta/Images.xcassets/image_editor_caption.imageset/caption-24@3x.png similarity index 100% rename from Session/Images.xcassets/image_editor_caption.imageset/caption-24@3x.png rename to Session/Meta/Images.xcassets/image_editor_caption.imageset/caption-24@3x.png diff --git a/Session/Images.xcassets/image_editor_checkmark_empty.imageset/Contents.json b/Session/Meta/Images.xcassets/image_editor_checkmark_empty.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/image_editor_checkmark_empty.imageset/Contents.json rename to Session/Meta/Images.xcassets/image_editor_checkmark_empty.imageset/Contents.json diff --git a/Session/Images.xcassets/image_editor_checkmark_empty.imageset/checkmark-circle-outline-32@1x.png b/Session/Meta/Images.xcassets/image_editor_checkmark_empty.imageset/checkmark-circle-outline-32@1x.png similarity index 100% rename from Session/Images.xcassets/image_editor_checkmark_empty.imageset/checkmark-circle-outline-32@1x.png rename to Session/Meta/Images.xcassets/image_editor_checkmark_empty.imageset/checkmark-circle-outline-32@1x.png diff --git a/Session/Images.xcassets/image_editor_checkmark_empty.imageset/checkmark-circle-outline-32@2x.png b/Session/Meta/Images.xcassets/image_editor_checkmark_empty.imageset/checkmark-circle-outline-32@2x.png similarity index 100% rename from Session/Images.xcassets/image_editor_checkmark_empty.imageset/checkmark-circle-outline-32@2x.png rename to Session/Meta/Images.xcassets/image_editor_checkmark_empty.imageset/checkmark-circle-outline-32@2x.png diff --git a/Session/Images.xcassets/image_editor_checkmark_empty.imageset/checkmark-circle-outline-32@3x.png b/Session/Meta/Images.xcassets/image_editor_checkmark_empty.imageset/checkmark-circle-outline-32@3x.png similarity index 100% rename from Session/Images.xcassets/image_editor_checkmark_empty.imageset/checkmark-circle-outline-32@3x.png rename to Session/Meta/Images.xcassets/image_editor_checkmark_empty.imageset/checkmark-circle-outline-32@3x.png diff --git a/Session/Images.xcassets/image_editor_checkmark_full.imageset/Contents.json b/Session/Meta/Images.xcassets/image_editor_checkmark_full.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/image_editor_checkmark_full.imageset/Contents.json rename to Session/Meta/Images.xcassets/image_editor_checkmark_full.imageset/Contents.json diff --git a/Session/Images.xcassets/image_editor_checkmark_full.imageset/checkmark-circle-filled-32@1x.png b/Session/Meta/Images.xcassets/image_editor_checkmark_full.imageset/checkmark-circle-filled-32@1x.png similarity index 100% rename from Session/Images.xcassets/image_editor_checkmark_full.imageset/checkmark-circle-filled-32@1x.png rename to Session/Meta/Images.xcassets/image_editor_checkmark_full.imageset/checkmark-circle-filled-32@1x.png diff --git a/Session/Images.xcassets/image_editor_checkmark_full.imageset/checkmark-circle-filled-32@2x.png b/Session/Meta/Images.xcassets/image_editor_checkmark_full.imageset/checkmark-circle-filled-32@2x.png similarity index 100% rename from Session/Images.xcassets/image_editor_checkmark_full.imageset/checkmark-circle-filled-32@2x.png rename to Session/Meta/Images.xcassets/image_editor_checkmark_full.imageset/checkmark-circle-filled-32@2x.png diff --git a/Session/Images.xcassets/image_editor_checkmark_full.imageset/checkmark-circle-filled-32@3x.png b/Session/Meta/Images.xcassets/image_editor_checkmark_full.imageset/checkmark-circle-filled-32@3x.png similarity index 100% rename from Session/Images.xcassets/image_editor_checkmark_full.imageset/checkmark-circle-filled-32@3x.png rename to Session/Meta/Images.xcassets/image_editor_checkmark_full.imageset/checkmark-circle-filled-32@3x.png diff --git a/Session/Images.xcassets/image_editor_crop.imageset/Contents.json b/Session/Meta/Images.xcassets/image_editor_crop.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/image_editor_crop.imageset/Contents.json rename to Session/Meta/Images.xcassets/image_editor_crop.imageset/Contents.json diff --git a/Session/Images.xcassets/image_editor_crop.imageset/crop-32@1x.png b/Session/Meta/Images.xcassets/image_editor_crop.imageset/crop-32@1x.png similarity index 100% rename from Session/Images.xcassets/image_editor_crop.imageset/crop-32@1x.png rename to Session/Meta/Images.xcassets/image_editor_crop.imageset/crop-32@1x.png diff --git a/Session/Images.xcassets/image_editor_crop.imageset/crop-32@2x.png b/Session/Meta/Images.xcassets/image_editor_crop.imageset/crop-32@2x.png similarity index 100% rename from Session/Images.xcassets/image_editor_crop.imageset/crop-32@2x.png rename to Session/Meta/Images.xcassets/image_editor_crop.imageset/crop-32@2x.png diff --git a/Session/Images.xcassets/image_editor_crop.imageset/crop-32@3x.png b/Session/Meta/Images.xcassets/image_editor_crop.imageset/crop-32@3x.png similarity index 100% rename from Session/Images.xcassets/image_editor_crop.imageset/crop-32@3x.png rename to Session/Meta/Images.xcassets/image_editor_crop.imageset/crop-32@3x.png diff --git a/Session/Images.xcassets/image_editor_crop_lock.imageset/Contents.json b/Session/Meta/Images.xcassets/image_editor_crop_lock.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/image_editor_crop_lock.imageset/Contents.json rename to Session/Meta/Images.xcassets/image_editor_crop_lock.imageset/Contents.json diff --git a/Session/Images.xcassets/image_editor_crop_lock.imageset/crop-lock-32@1x.png b/Session/Meta/Images.xcassets/image_editor_crop_lock.imageset/crop-lock-32@1x.png similarity index 100% rename from Session/Images.xcassets/image_editor_crop_lock.imageset/crop-lock-32@1x.png rename to Session/Meta/Images.xcassets/image_editor_crop_lock.imageset/crop-lock-32@1x.png diff --git a/Session/Images.xcassets/image_editor_crop_lock.imageset/crop-lock-32@2x.png b/Session/Meta/Images.xcassets/image_editor_crop_lock.imageset/crop-lock-32@2x.png similarity index 100% rename from Session/Images.xcassets/image_editor_crop_lock.imageset/crop-lock-32@2x.png rename to Session/Meta/Images.xcassets/image_editor_crop_lock.imageset/crop-lock-32@2x.png diff --git a/Session/Images.xcassets/image_editor_crop_lock.imageset/crop-lock-32@3x.png b/Session/Meta/Images.xcassets/image_editor_crop_lock.imageset/crop-lock-32@3x.png similarity index 100% rename from Session/Images.xcassets/image_editor_crop_lock.imageset/crop-lock-32@3x.png rename to Session/Meta/Images.xcassets/image_editor_crop_lock.imageset/crop-lock-32@3x.png diff --git a/Session/Images.xcassets/image_editor_crop_unlock.imageset/Contents.json b/Session/Meta/Images.xcassets/image_editor_crop_unlock.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/image_editor_crop_unlock.imageset/Contents.json rename to Session/Meta/Images.xcassets/image_editor_crop_unlock.imageset/Contents.json diff --git a/Session/Images.xcassets/image_editor_crop_unlock.imageset/crop-unlock-32@1x.png b/Session/Meta/Images.xcassets/image_editor_crop_unlock.imageset/crop-unlock-32@1x.png similarity index 100% rename from Session/Images.xcassets/image_editor_crop_unlock.imageset/crop-unlock-32@1x.png rename to Session/Meta/Images.xcassets/image_editor_crop_unlock.imageset/crop-unlock-32@1x.png diff --git a/Session/Images.xcassets/image_editor_crop_unlock.imageset/crop-unlock-32@2x.png b/Session/Meta/Images.xcassets/image_editor_crop_unlock.imageset/crop-unlock-32@2x.png similarity index 100% rename from Session/Images.xcassets/image_editor_crop_unlock.imageset/crop-unlock-32@2x.png rename to Session/Meta/Images.xcassets/image_editor_crop_unlock.imageset/crop-unlock-32@2x.png diff --git a/Session/Images.xcassets/image_editor_crop_unlock.imageset/crop-unlock-32@3x.png b/Session/Meta/Images.xcassets/image_editor_crop_unlock.imageset/crop-unlock-32@3x.png similarity index 100% rename from Session/Images.xcassets/image_editor_crop_unlock.imageset/crop-unlock-32@3x.png rename to Session/Meta/Images.xcassets/image_editor_crop_unlock.imageset/crop-unlock-32@3x.png diff --git a/Session/Images.xcassets/image_editor_flip.imageset/Contents.json b/Session/Meta/Images.xcassets/image_editor_flip.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/image_editor_flip.imageset/Contents.json rename to Session/Meta/Images.xcassets/image_editor_flip.imageset/Contents.json diff --git a/Session/Images.xcassets/image_editor_flip.imageset/flip-32@1x.png b/Session/Meta/Images.xcassets/image_editor_flip.imageset/flip-32@1x.png similarity index 100% rename from Session/Images.xcassets/image_editor_flip.imageset/flip-32@1x.png rename to Session/Meta/Images.xcassets/image_editor_flip.imageset/flip-32@1x.png diff --git a/Session/Images.xcassets/image_editor_flip.imageset/flip-32@2x.png b/Session/Meta/Images.xcassets/image_editor_flip.imageset/flip-32@2x.png similarity index 100% rename from Session/Images.xcassets/image_editor_flip.imageset/flip-32@2x.png rename to Session/Meta/Images.xcassets/image_editor_flip.imageset/flip-32@2x.png diff --git a/Session/Images.xcassets/image_editor_flip.imageset/flip-32@3x.png b/Session/Meta/Images.xcassets/image_editor_flip.imageset/flip-32@3x.png similarity index 100% rename from Session/Images.xcassets/image_editor_flip.imageset/flip-32@3x.png rename to Session/Meta/Images.xcassets/image_editor_flip.imageset/flip-32@3x.png diff --git a/Session/Images.xcassets/image_editor_rotate.imageset/Contents.json b/Session/Meta/Images.xcassets/image_editor_rotate.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/image_editor_rotate.imageset/Contents.json rename to Session/Meta/Images.xcassets/image_editor_rotate.imageset/Contents.json diff --git a/Session/Images.xcassets/image_editor_rotate.imageset/rotate-32@1x.png b/Session/Meta/Images.xcassets/image_editor_rotate.imageset/rotate-32@1x.png similarity index 100% rename from Session/Images.xcassets/image_editor_rotate.imageset/rotate-32@1x.png rename to Session/Meta/Images.xcassets/image_editor_rotate.imageset/rotate-32@1x.png diff --git a/Session/Images.xcassets/image_editor_rotate.imageset/rotate-32@2x.png b/Session/Meta/Images.xcassets/image_editor_rotate.imageset/rotate-32@2x.png similarity index 100% rename from Session/Images.xcassets/image_editor_rotate.imageset/rotate-32@2x.png rename to Session/Meta/Images.xcassets/image_editor_rotate.imageset/rotate-32@2x.png diff --git a/Session/Images.xcassets/image_editor_rotate.imageset/rotate-32@3x.png b/Session/Meta/Images.xcassets/image_editor_rotate.imageset/rotate-32@3x.png similarity index 100% rename from Session/Images.xcassets/image_editor_rotate.imageset/rotate-32@3x.png rename to Session/Meta/Images.xcassets/image_editor_rotate.imageset/rotate-32@3x.png diff --git a/Session/Images.xcassets/image_editor_text.imageset/Contents.json b/Session/Meta/Images.xcassets/image_editor_text.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/image_editor_text.imageset/Contents.json rename to Session/Meta/Images.xcassets/image_editor_text.imageset/Contents.json diff --git a/Session/Images.xcassets/image_editor_text.imageset/text-32@1x.png b/Session/Meta/Images.xcassets/image_editor_text.imageset/text-32@1x.png similarity index 100% rename from Session/Images.xcassets/image_editor_text.imageset/text-32@1x.png rename to Session/Meta/Images.xcassets/image_editor_text.imageset/text-32@1x.png diff --git a/Session/Images.xcassets/image_editor_text.imageset/text-32@2x.png b/Session/Meta/Images.xcassets/image_editor_text.imageset/text-32@2x.png similarity index 100% rename from Session/Images.xcassets/image_editor_text.imageset/text-32@2x.png rename to Session/Meta/Images.xcassets/image_editor_text.imageset/text-32@2x.png diff --git a/Session/Images.xcassets/image_editor_text.imageset/text-32@3x.png b/Session/Meta/Images.xcassets/image_editor_text.imageset/text-32@3x.png similarity index 100% rename from Session/Images.xcassets/image_editor_text.imageset/text-32@3x.png rename to Session/Meta/Images.xcassets/image_editor_text.imageset/text-32@3x.png diff --git a/Session/Images.xcassets/image_editor_undo.imageset/Contents.json b/Session/Meta/Images.xcassets/image_editor_undo.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/image_editor_undo.imageset/Contents.json rename to Session/Meta/Images.xcassets/image_editor_undo.imageset/Contents.json diff --git a/Session/Images.xcassets/image_editor_undo.imageset/undo-32@1x.png b/Session/Meta/Images.xcassets/image_editor_undo.imageset/undo-32@1x.png similarity index 100% rename from Session/Images.xcassets/image_editor_undo.imageset/undo-32@1x.png rename to Session/Meta/Images.xcassets/image_editor_undo.imageset/undo-32@1x.png diff --git a/Session/Images.xcassets/image_editor_undo.imageset/undo-32@2x.png b/Session/Meta/Images.xcassets/image_editor_undo.imageset/undo-32@2x.png similarity index 100% rename from Session/Images.xcassets/image_editor_undo.imageset/undo-32@2x.png rename to Session/Meta/Images.xcassets/image_editor_undo.imageset/undo-32@2x.png diff --git a/Session/Images.xcassets/image_editor_undo.imageset/undo-32@3x.png b/Session/Meta/Images.xcassets/image_editor_undo.imageset/undo-32@3x.png similarity index 100% rename from Session/Images.xcassets/image_editor_undo.imageset/undo-32@3x.png rename to Session/Meta/Images.xcassets/image_editor_undo.imageset/undo-32@3x.png diff --git a/Session/Images.xcassets/introducing-link-previews-dark.imageset/Contents.json b/Session/Meta/Images.xcassets/introducing-link-previews-dark.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/introducing-link-previews-dark.imageset/Contents.json rename to Session/Meta/Images.xcassets/introducing-link-previews-dark.imageset/Contents.json diff --git a/Session/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@1x.png b/Session/Meta/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@1x.png similarity index 100% rename from Session/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@1x.png rename to Session/Meta/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@1x.png diff --git a/Session/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@2x.png b/Session/Meta/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@2x.png similarity index 100% rename from Session/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@2x.png rename to Session/Meta/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@2x.png diff --git a/Session/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@3x.png b/Session/Meta/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@3x.png similarity index 100% rename from Session/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@3x.png rename to Session/Meta/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@3x.png diff --git a/Session/Images.xcassets/introducing-link-previews-light.imageset/Contents.json b/Session/Meta/Images.xcassets/introducing-link-previews-light.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/introducing-link-previews-light.imageset/Contents.json rename to Session/Meta/Images.xcassets/introducing-link-previews-light.imageset/Contents.json diff --git a/Session/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@1x.png b/Session/Meta/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@1x.png similarity index 100% rename from Session/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@1x.png rename to Session/Meta/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@1x.png diff --git a/Session/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@2x.png b/Session/Meta/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@2x.png similarity index 100% rename from Session/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@2x.png rename to Session/Meta/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@2x.png diff --git a/Session/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@3x.png b/Session/Meta/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@3x.png similarity index 100% rename from Session/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@3x.png rename to Session/Meta/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@3x.png diff --git a/Session/Images.xcassets/introductory_splash_callkit.imageset/Contents.json b/Session/Meta/Images.xcassets/introductory_splash_callkit.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/introductory_splash_callkit.imageset/Contents.json rename to Session/Meta/Images.xcassets/introductory_splash_callkit.imageset/Contents.json diff --git a/Session/Images.xcassets/introductory_splash_callkit.imageset/signal-answer.png b/Session/Meta/Images.xcassets/introductory_splash_callkit.imageset/signal-answer.png similarity index 100% rename from Session/Images.xcassets/introductory_splash_callkit.imageset/signal-answer.png rename to Session/Meta/Images.xcassets/introductory_splash_callkit.imageset/signal-answer.png diff --git a/Session/Images.xcassets/introductory_splash_callkit.imageset/signal-answer@2x.png b/Session/Meta/Images.xcassets/introductory_splash_callkit.imageset/signal-answer@2x.png similarity index 100% rename from Session/Images.xcassets/introductory_splash_callkit.imageset/signal-answer@2x.png rename to Session/Meta/Images.xcassets/introductory_splash_callkit.imageset/signal-answer@2x.png diff --git a/Session/Images.xcassets/introductory_splash_callkit.imageset/signal-answer@3x.png b/Session/Meta/Images.xcassets/introductory_splash_callkit.imageset/signal-answer@3x.png similarity index 100% rename from Session/Images.xcassets/introductory_splash_callkit.imageset/signal-answer@3x.png rename to Session/Meta/Images.xcassets/introductory_splash_callkit.imageset/signal-answer@3x.png diff --git a/Session/Images.xcassets/introductory_splash_custom_audio.imageset/Contents.json b/Session/Meta/Images.xcassets/introductory_splash_custom_audio.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/introductory_splash_custom_audio.imageset/Contents.json rename to Session/Meta/Images.xcassets/introductory_splash_custom_audio.imageset/Contents.json diff --git a/Session/Images.xcassets/introductory_splash_custom_audio.imageset/signal-possum-far-wclouds@1x.png b/Session/Meta/Images.xcassets/introductory_splash_custom_audio.imageset/signal-possum-far-wclouds@1x.png similarity index 100% rename from Session/Images.xcassets/introductory_splash_custom_audio.imageset/signal-possum-far-wclouds@1x.png rename to Session/Meta/Images.xcassets/introductory_splash_custom_audio.imageset/signal-possum-far-wclouds@1x.png diff --git a/Session/Images.xcassets/introductory_splash_custom_audio.imageset/signal-possum-far-wclouds@2x.png b/Session/Meta/Images.xcassets/introductory_splash_custom_audio.imageset/signal-possum-far-wclouds@2x.png similarity index 100% rename from Session/Images.xcassets/introductory_splash_custom_audio.imageset/signal-possum-far-wclouds@2x.png rename to Session/Meta/Images.xcassets/introductory_splash_custom_audio.imageset/signal-possum-far-wclouds@2x.png diff --git a/Session/Images.xcassets/introductory_splash_custom_audio.imageset/signal-possum-far-wclouds@3x.png b/Session/Meta/Images.xcassets/introductory_splash_custom_audio.imageset/signal-possum-far-wclouds@3x.png similarity index 100% rename from Session/Images.xcassets/introductory_splash_custom_audio.imageset/signal-possum-far-wclouds@3x.png rename to Session/Meta/Images.xcassets/introductory_splash_custom_audio.imageset/signal-possum-far-wclouds@3x.png diff --git a/Session/Images.xcassets/introductory_splash_profile.imageset/Contents.json b/Session/Meta/Images.xcassets/introductory_splash_profile.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/introductory_splash_profile.imageset/Contents.json rename to Session/Meta/Images.xcassets/introductory_splash_profile.imageset/Contents.json diff --git a/Session/Images.xcassets/introductory_splash_profile.imageset/introductory_splash_profile.png b/Session/Meta/Images.xcassets/introductory_splash_profile.imageset/introductory_splash_profile.png similarity index 100% rename from Session/Images.xcassets/introductory_splash_profile.imageset/introductory_splash_profile.png rename to Session/Meta/Images.xcassets/introductory_splash_profile.imageset/introductory_splash_profile.png diff --git a/Session/Images.xcassets/introductory_splash_profile.imageset/introductory_splash_profile@2x.png b/Session/Meta/Images.xcassets/introductory_splash_profile.imageset/introductory_splash_profile@2x.png similarity index 100% rename from Session/Images.xcassets/introductory_splash_profile.imageset/introductory_splash_profile@2x.png rename to Session/Meta/Images.xcassets/introductory_splash_profile.imageset/introductory_splash_profile@2x.png diff --git a/Session/Images.xcassets/introductory_splash_profile.imageset/introductory_splash_profile@3x.png b/Session/Meta/Images.xcassets/introductory_splash_profile.imageset/introductory_splash_profile@3x.png similarity index 100% rename from Session/Images.xcassets/introductory_splash_profile.imageset/introductory_splash_profile@3x.png rename to Session/Meta/Images.xcassets/introductory_splash_profile.imageset/introductory_splash_profile@3x.png diff --git a/Session/Images.xcassets/introductory_splash_read_receipts.imageset/Contents.json b/Session/Meta/Images.xcassets/introductory_splash_read_receipts.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/introductory_splash_read_receipts.imageset/Contents.json rename to Session/Meta/Images.xcassets/introductory_splash_read_receipts.imageset/Contents.json diff --git a/Session/Images.xcassets/introductory_splash_read_receipts.imageset/signal-penguin-letter@1x.png b/Session/Meta/Images.xcassets/introductory_splash_read_receipts.imageset/signal-penguin-letter@1x.png similarity index 100% rename from Session/Images.xcassets/introductory_splash_read_receipts.imageset/signal-penguin-letter@1x.png rename to Session/Meta/Images.xcassets/introductory_splash_read_receipts.imageset/signal-penguin-letter@1x.png diff --git a/Session/Images.xcassets/introductory_splash_read_receipts.imageset/signal-penguin-letter@2x.png b/Session/Meta/Images.xcassets/introductory_splash_read_receipts.imageset/signal-penguin-letter@2x.png similarity index 100% rename from Session/Images.xcassets/introductory_splash_read_receipts.imageset/signal-penguin-letter@2x.png rename to Session/Meta/Images.xcassets/introductory_splash_read_receipts.imageset/signal-penguin-letter@2x.png diff --git a/Session/Images.xcassets/introductory_splash_read_receipts.imageset/signal-penguin-letter@3x.png b/Session/Meta/Images.xcassets/introductory_splash_read_receipts.imageset/signal-penguin-letter@3x.png similarity index 100% rename from Session/Images.xcassets/introductory_splash_read_receipts.imageset/signal-penguin-letter@3x.png rename to Session/Meta/Images.xcassets/introductory_splash_read_receipts.imageset/signal-penguin-letter@3x.png diff --git a/Session/Images.xcassets/introductory_splash_video_calling.imageset/Contents.json b/Session/Meta/Images.xcassets/introductory_splash_video_calling.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/introductory_splash_video_calling.imageset/Contents.json rename to Session/Meta/Images.xcassets/introductory_splash_video_calling.imageset/Contents.json diff --git a/Session/Images.xcassets/introductory_splash_video_calling.imageset/signal-video-splash.png b/Session/Meta/Images.xcassets/introductory_splash_video_calling.imageset/signal-video-splash.png similarity index 100% rename from Session/Images.xcassets/introductory_splash_video_calling.imageset/signal-video-splash.png rename to Session/Meta/Images.xcassets/introductory_splash_video_calling.imageset/signal-video-splash.png diff --git a/Session/Images.xcassets/introductory_splash_video_calling.imageset/signal-video-splash@2x.png b/Session/Meta/Images.xcassets/introductory_splash_video_calling.imageset/signal-video-splash@2x.png similarity index 100% rename from Session/Images.xcassets/introductory_splash_video_calling.imageset/signal-video-splash@2x.png rename to Session/Meta/Images.xcassets/introductory_splash_video_calling.imageset/signal-video-splash@2x.png diff --git a/Session/Images.xcassets/introductory_splash_video_calling.imageset/signal-video-splash@3x.png b/Session/Meta/Images.xcassets/introductory_splash_video_calling.imageset/signal-video-splash@3x.png similarity index 100% rename from Session/Images.xcassets/introductory_splash_video_calling.imageset/signal-video-splash@3x.png rename to Session/Meta/Images.xcassets/introductory_splash_video_calling.imageset/signal-video-splash@3x.png diff --git a/Session/Images.xcassets/logoSignal.imageset/Contents.json b/Session/Meta/Images.xcassets/logoSignal.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/logoSignal.imageset/Contents.json rename to Session/Meta/Images.xcassets/logoSignal.imageset/Contents.json diff --git a/Session/Images.xcassets/logoSignal.imageset/logoSignal.pdf b/Session/Meta/Images.xcassets/logoSignal.imageset/logoSignal.pdf similarity index 100% rename from Session/Images.xcassets/logoSignal.imageset/logoSignal.pdf rename to Session/Meta/Images.xcassets/logoSignal.imageset/logoSignal.pdf diff --git a/Session/Images.xcassets/media_album_caption.imageset/Contents.json b/Session/Meta/Images.xcassets/media_album_caption.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/media_album_caption.imageset/Contents.json rename to Session/Meta/Images.xcassets/media_album_caption.imageset/Contents.json diff --git a/Session/Images.xcassets/media_album_caption.imageset/caption-shadow-24@1x.png b/Session/Meta/Images.xcassets/media_album_caption.imageset/caption-shadow-24@1x.png similarity index 100% rename from Session/Images.xcassets/media_album_caption.imageset/caption-shadow-24@1x.png rename to Session/Meta/Images.xcassets/media_album_caption.imageset/caption-shadow-24@1x.png diff --git a/Session/Images.xcassets/media_album_caption.imageset/caption-shadow-24@2x.png b/Session/Meta/Images.xcassets/media_album_caption.imageset/caption-shadow-24@2x.png similarity index 100% rename from Session/Images.xcassets/media_album_caption.imageset/caption-shadow-24@2x.png rename to Session/Meta/Images.xcassets/media_album_caption.imageset/caption-shadow-24@2x.png diff --git a/Session/Images.xcassets/media_album_caption.imageset/caption-shadow-24@3x.png b/Session/Meta/Images.xcassets/media_album_caption.imageset/caption-shadow-24@3x.png similarity index 100% rename from Session/Images.xcassets/media_album_caption.imageset/caption-shadow-24@3x.png rename to Session/Meta/Images.xcassets/media_album_caption.imageset/caption-shadow-24@3x.png diff --git a/Session/Images.xcassets/media_invalid.imageset/Contents.json b/Session/Meta/Images.xcassets/media_invalid.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/media_invalid.imageset/Contents.json rename to Session/Meta/Images.xcassets/media_invalid.imageset/Contents.json diff --git a/Session/Images.xcassets/media_invalid.imageset/photo-error-36.png b/Session/Meta/Images.xcassets/media_invalid.imageset/photo-error-36.png similarity index 100% rename from Session/Images.xcassets/media_invalid.imageset/photo-error-36.png rename to Session/Meta/Images.xcassets/media_invalid.imageset/photo-error-36.png diff --git a/Session/Images.xcassets/media_invalid.imageset/photo-error-36@2x.png b/Session/Meta/Images.xcassets/media_invalid.imageset/photo-error-36@2x.png similarity index 100% rename from Session/Images.xcassets/media_invalid.imageset/photo-error-36@2x.png rename to Session/Meta/Images.xcassets/media_invalid.imageset/photo-error-36@2x.png diff --git a/Session/Images.xcassets/media_invalid.imageset/photo-error-36@3x.png b/Session/Meta/Images.xcassets/media_invalid.imageset/photo-error-36@3x.png similarity index 100% rename from Session/Images.xcassets/media_invalid.imageset/photo-error-36@3x.png rename to Session/Meta/Images.xcassets/media_invalid.imageset/photo-error-36@3x.png diff --git a/Session/Images.xcassets/media_retry.imageset/Contents.json b/Session/Meta/Images.xcassets/media_retry.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/media_retry.imageset/Contents.json rename to Session/Meta/Images.xcassets/media_retry.imageset/Contents.json diff --git a/Session/Images.xcassets/media_retry.imageset/retry-36.png b/Session/Meta/Images.xcassets/media_retry.imageset/retry-36.png similarity index 100% rename from Session/Images.xcassets/media_retry.imageset/retry-36.png rename to Session/Meta/Images.xcassets/media_retry.imageset/retry-36.png diff --git a/Session/Images.xcassets/media_retry.imageset/retry-36@2x.png b/Session/Meta/Images.xcassets/media_retry.imageset/retry-36@2x.png similarity index 100% rename from Session/Images.xcassets/media_retry.imageset/retry-36@2x.png rename to Session/Meta/Images.xcassets/media_retry.imageset/retry-36@2x.png diff --git a/Session/Images.xcassets/media_retry.imageset/retry-36@3x.png b/Session/Meta/Images.xcassets/media_retry.imageset/retry-36@3x.png similarity index 100% rename from Session/Images.xcassets/media_retry.imageset/retry-36@3x.png rename to Session/Meta/Images.xcassets/media_retry.imageset/retry-36@3x.png diff --git a/Session/Images.xcassets/media_send_batch_mode_disabled.imageset/Contents.json b/Session/Meta/Images.xcassets/media_send_batch_mode_disabled.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/media_send_batch_mode_disabled.imageset/Contents.json rename to Session/Meta/Images.xcassets/media_send_batch_mode_disabled.imageset/Contents.json diff --git a/Session/Images.xcassets/media_send_batch_mode_disabled.imageset/create-album-outline-32@1x.png b/Session/Meta/Images.xcassets/media_send_batch_mode_disabled.imageset/create-album-outline-32@1x.png similarity index 100% rename from Session/Images.xcassets/media_send_batch_mode_disabled.imageset/create-album-outline-32@1x.png rename to Session/Meta/Images.xcassets/media_send_batch_mode_disabled.imageset/create-album-outline-32@1x.png diff --git a/Session/Images.xcassets/media_send_batch_mode_disabled.imageset/create-album-outline-32@2x.png b/Session/Meta/Images.xcassets/media_send_batch_mode_disabled.imageset/create-album-outline-32@2x.png similarity index 100% rename from Session/Images.xcassets/media_send_batch_mode_disabled.imageset/create-album-outline-32@2x.png rename to Session/Meta/Images.xcassets/media_send_batch_mode_disabled.imageset/create-album-outline-32@2x.png diff --git a/Session/Images.xcassets/media_send_batch_mode_disabled.imageset/create-album-outline-32@3x.png b/Session/Meta/Images.xcassets/media_send_batch_mode_disabled.imageset/create-album-outline-32@3x.png similarity index 100% rename from Session/Images.xcassets/media_send_batch_mode_disabled.imageset/create-album-outline-32@3x.png rename to Session/Meta/Images.xcassets/media_send_batch_mode_disabled.imageset/create-album-outline-32@3x.png diff --git a/Session/Images.xcassets/message-active-wide.imageset/Contents.json b/Session/Meta/Images.xcassets/message-active-wide.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/message-active-wide.imageset/Contents.json rename to Session/Meta/Images.xcassets/message-active-wide.imageset/Contents.json diff --git a/Session/Images.xcassets/message-active-wide.imageset/message-active-wide.png b/Session/Meta/Images.xcassets/message-active-wide.imageset/message-active-wide.png similarity index 100% rename from Session/Images.xcassets/message-active-wide.imageset/message-active-wide.png rename to Session/Meta/Images.xcassets/message-active-wide.imageset/message-active-wide.png diff --git a/Session/Images.xcassets/message_status_delivered.imageset/Contents.json b/Session/Meta/Images.xcassets/message_status_delivered.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/message_status_delivered.imageset/Contents.json rename to Session/Meta/Images.xcassets/message_status_delivered.imageset/Contents.json diff --git a/Session/Images.xcassets/message_status_delivered.imageset/delivered-18x12@1x.png b/Session/Meta/Images.xcassets/message_status_delivered.imageset/delivered-18x12@1x.png similarity index 100% rename from Session/Images.xcassets/message_status_delivered.imageset/delivered-18x12@1x.png rename to Session/Meta/Images.xcassets/message_status_delivered.imageset/delivered-18x12@1x.png diff --git a/Session/Images.xcassets/message_status_delivered.imageset/double check@2x.png b/Session/Meta/Images.xcassets/message_status_delivered.imageset/double check@2x.png similarity index 100% rename from Session/Images.xcassets/message_status_delivered.imageset/double check@2x.png rename to Session/Meta/Images.xcassets/message_status_delivered.imageset/double check@2x.png diff --git a/Session/Images.xcassets/message_status_delivered.imageset/double check@3x.png b/Session/Meta/Images.xcassets/message_status_delivered.imageset/double check@3x.png similarity index 100% rename from Session/Images.xcassets/message_status_delivered.imageset/double check@3x.png rename to Session/Meta/Images.xcassets/message_status_delivered.imageset/double check@3x.png diff --git a/Session/Images.xcassets/message_status_failed.imageset/Contents.json b/Session/Meta/Images.xcassets/message_status_failed.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/message_status_failed.imageset/Contents.json rename to Session/Meta/Images.xcassets/message_status_failed.imageset/Contents.json diff --git a/Session/Images.xcassets/message_status_failed.imageset/error-12@1x.png b/Session/Meta/Images.xcassets/message_status_failed.imageset/error-12@1x.png similarity index 100% rename from Session/Images.xcassets/message_status_failed.imageset/error-12@1x.png rename to Session/Meta/Images.xcassets/message_status_failed.imageset/error-12@1x.png diff --git a/Session/Images.xcassets/message_status_failed.imageset/error-12@2x.png b/Session/Meta/Images.xcassets/message_status_failed.imageset/error-12@2x.png similarity index 100% rename from Session/Images.xcassets/message_status_failed.imageset/error-12@2x.png rename to Session/Meta/Images.xcassets/message_status_failed.imageset/error-12@2x.png diff --git a/Session/Images.xcassets/message_status_failed.imageset/error-12@3x.png b/Session/Meta/Images.xcassets/message_status_failed.imageset/error-12@3x.png similarity index 100% rename from Session/Images.xcassets/message_status_failed.imageset/error-12@3x.png rename to Session/Meta/Images.xcassets/message_status_failed.imageset/error-12@3x.png diff --git a/Session/Images.xcassets/message_status_failed_large.imageset/Contents.json b/Session/Meta/Images.xcassets/message_status_failed_large.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/message_status_failed_large.imageset/Contents.json rename to Session/Meta/Images.xcassets/message_status_failed_large.imageset/Contents.json diff --git a/Session/Images.xcassets/message_status_failed_large.imageset/error-20@1x.png b/Session/Meta/Images.xcassets/message_status_failed_large.imageset/error-20@1x.png similarity index 100% rename from Session/Images.xcassets/message_status_failed_large.imageset/error-20@1x.png rename to Session/Meta/Images.xcassets/message_status_failed_large.imageset/error-20@1x.png diff --git a/Session/Images.xcassets/message_status_failed_large.imageset/error-20@2x.png b/Session/Meta/Images.xcassets/message_status_failed_large.imageset/error-20@2x.png similarity index 100% rename from Session/Images.xcassets/message_status_failed_large.imageset/error-20@2x.png rename to Session/Meta/Images.xcassets/message_status_failed_large.imageset/error-20@2x.png diff --git a/Session/Images.xcassets/message_status_failed_large.imageset/error-20@3x.png b/Session/Meta/Images.xcassets/message_status_failed_large.imageset/error-20@3x.png similarity index 100% rename from Session/Images.xcassets/message_status_failed_large.imageset/error-20@3x.png rename to Session/Meta/Images.xcassets/message_status_failed_large.imageset/error-20@3x.png diff --git a/Session/Images.xcassets/message_status_read.imageset/Contents.json b/Session/Meta/Images.xcassets/message_status_read.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/message_status_read.imageset/Contents.json rename to Session/Meta/Images.xcassets/message_status_read.imageset/Contents.json diff --git a/Session/Images.xcassets/message_status_read.imageset/read-18x12@1x.png b/Session/Meta/Images.xcassets/message_status_read.imageset/read-18x12@1x.png similarity index 100% rename from Session/Images.xcassets/message_status_read.imageset/read-18x12@1x.png rename to Session/Meta/Images.xcassets/message_status_read.imageset/read-18x12@1x.png diff --git a/Session/Images.xcassets/message_status_read.imageset/read-18x12@2x.png b/Session/Meta/Images.xcassets/message_status_read.imageset/read-18x12@2x.png similarity index 100% rename from Session/Images.xcassets/message_status_read.imageset/read-18x12@2x.png rename to Session/Meta/Images.xcassets/message_status_read.imageset/read-18x12@2x.png diff --git a/Session/Images.xcassets/message_status_read.imageset/read-18x12@3x.png b/Session/Meta/Images.xcassets/message_status_read.imageset/read-18x12@3x.png similarity index 100% rename from Session/Images.xcassets/message_status_read.imageset/read-18x12@3x.png rename to Session/Meta/Images.xcassets/message_status_read.imageset/read-18x12@3x.png diff --git a/Session/Images.xcassets/message_status_sending.imageset/Contents.json b/Session/Meta/Images.xcassets/message_status_sending.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/message_status_sending.imageset/Contents.json rename to Session/Meta/Images.xcassets/message_status_sending.imageset/Contents.json diff --git a/Session/Images.xcassets/message_status_sending.imageset/sending@1x.png b/Session/Meta/Images.xcassets/message_status_sending.imageset/sending@1x.png similarity index 100% rename from Session/Images.xcassets/message_status_sending.imageset/sending@1x.png rename to Session/Meta/Images.xcassets/message_status_sending.imageset/sending@1x.png diff --git a/Session/Images.xcassets/message_status_sending.imageset/sending@2x.png b/Session/Meta/Images.xcassets/message_status_sending.imageset/sending@2x.png similarity index 100% rename from Session/Images.xcassets/message_status_sending.imageset/sending@2x.png rename to Session/Meta/Images.xcassets/message_status_sending.imageset/sending@2x.png diff --git a/Session/Images.xcassets/message_status_sending.imageset/sending@3x.png b/Session/Meta/Images.xcassets/message_status_sending.imageset/sending@3x.png similarity index 100% rename from Session/Images.xcassets/message_status_sending.imageset/sending@3x.png rename to Session/Meta/Images.xcassets/message_status_sending.imageset/sending@3x.png diff --git a/Session/Images.xcassets/message_status_sent.imageset/Contents.json b/Session/Meta/Images.xcassets/message_status_sent.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/message_status_sent.imageset/Contents.json rename to Session/Meta/Images.xcassets/message_status_sent.imageset/Contents.json diff --git a/Session/Images.xcassets/message_status_sent.imageset/sent-12@1x.png b/Session/Meta/Images.xcassets/message_status_sent.imageset/sent-12@1x.png similarity index 100% rename from Session/Images.xcassets/message_status_sent.imageset/sent-12@1x.png rename to Session/Meta/Images.xcassets/message_status_sent.imageset/sent-12@1x.png diff --git a/Session/Images.xcassets/message_status_sent.imageset/sent-12@2x.png b/Session/Meta/Images.xcassets/message_status_sent.imageset/sent-12@2x.png similarity index 100% rename from Session/Images.xcassets/message_status_sent.imageset/sent-12@2x.png rename to Session/Meta/Images.xcassets/message_status_sent.imageset/sent-12@2x.png diff --git a/Session/Images.xcassets/message_status_sent.imageset/sent-12@3x.png b/Session/Meta/Images.xcassets/message_status_sent.imageset/sent-12@3x.png similarity index 100% rename from Session/Images.xcassets/message_status_sent.imageset/sent-12@3x.png rename to Session/Meta/Images.xcassets/message_status_sent.imageset/sent-12@3x.png diff --git a/Session/Images.xcassets/navbar_disclosure_down.imageset/Contents.json b/Session/Meta/Images.xcassets/navbar_disclosure_down.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/navbar_disclosure_down.imageset/Contents.json rename to Session/Meta/Images.xcassets/navbar_disclosure_down.imageset/Contents.json diff --git a/Session/Images.xcassets/navbar_disclosure_down.imageset/navbar_disclosure_down_small@1x.png b/Session/Meta/Images.xcassets/navbar_disclosure_down.imageset/navbar_disclosure_down_small@1x.png similarity index 100% rename from Session/Images.xcassets/navbar_disclosure_down.imageset/navbar_disclosure_down_small@1x.png rename to Session/Meta/Images.xcassets/navbar_disclosure_down.imageset/navbar_disclosure_down_small@1x.png diff --git a/Session/Images.xcassets/navbar_disclosure_down.imageset/navbar_disclosure_down_small@2x.png b/Session/Meta/Images.xcassets/navbar_disclosure_down.imageset/navbar_disclosure_down_small@2x.png similarity index 100% rename from Session/Images.xcassets/navbar_disclosure_down.imageset/navbar_disclosure_down_small@2x.png rename to Session/Meta/Images.xcassets/navbar_disclosure_down.imageset/navbar_disclosure_down_small@2x.png diff --git a/Session/Images.xcassets/navbar_disclosure_down.imageset/navbar_disclosure_down_small@3x.png b/Session/Meta/Images.xcassets/navbar_disclosure_down.imageset/navbar_disclosure_down_small@3x.png similarity index 100% rename from Session/Images.xcassets/navbar_disclosure_down.imageset/navbar_disclosure_down_small@3x.png rename to Session/Meta/Images.xcassets/navbar_disclosure_down.imageset/navbar_disclosure_down_small@3x.png diff --git a/Session/Images.xcassets/navbar_disclosure_up.imageset/Contents.json b/Session/Meta/Images.xcassets/navbar_disclosure_up.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/navbar_disclosure_up.imageset/Contents.json rename to Session/Meta/Images.xcassets/navbar_disclosure_up.imageset/Contents.json diff --git a/Session/Images.xcassets/navbar_disclosure_up.imageset/navbar_disclosure_up_small@1x.png b/Session/Meta/Images.xcassets/navbar_disclosure_up.imageset/navbar_disclosure_up_small@1x.png similarity index 100% rename from Session/Images.xcassets/navbar_disclosure_up.imageset/navbar_disclosure_up_small@1x.png rename to Session/Meta/Images.xcassets/navbar_disclosure_up.imageset/navbar_disclosure_up_small@1x.png diff --git a/Session/Images.xcassets/navbar_disclosure_up.imageset/navbar_disclosure_up_small@2x.png b/Session/Meta/Images.xcassets/navbar_disclosure_up.imageset/navbar_disclosure_up_small@2x.png similarity index 100% rename from Session/Images.xcassets/navbar_disclosure_up.imageset/navbar_disclosure_up_small@2x.png rename to Session/Meta/Images.xcassets/navbar_disclosure_up.imageset/navbar_disclosure_up_small@2x.png diff --git a/Session/Images.xcassets/navbar_disclosure_up.imageset/navbar_disclosure_up_small@3x.png b/Session/Meta/Images.xcassets/navbar_disclosure_up.imageset/navbar_disclosure_up_small@3x.png similarity index 100% rename from Session/Images.xcassets/navbar_disclosure_up.imageset/navbar_disclosure_up_small@3x.png rename to Session/Meta/Images.xcassets/navbar_disclosure_up.imageset/navbar_disclosure_up_small@3x.png diff --git a/Session/Images.xcassets/note-to-self-avatar.imageset/Contents.json b/Session/Meta/Images.xcassets/note-to-self-avatar.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/note-to-self-avatar.imageset/Contents.json rename to Session/Meta/Images.xcassets/note-to-self-avatar.imageset/Contents.json diff --git a/Session/Images.xcassets/note-to-self-avatar.imageset/note-24@1x.png b/Session/Meta/Images.xcassets/note-to-self-avatar.imageset/note-24@1x.png similarity index 100% rename from Session/Images.xcassets/note-to-self-avatar.imageset/note-24@1x.png rename to Session/Meta/Images.xcassets/note-to-self-avatar.imageset/note-24@1x.png diff --git a/Session/Images.xcassets/note-to-self-avatar.imageset/note-24@2x.png b/Session/Meta/Images.xcassets/note-to-self-avatar.imageset/note-24@2x.png similarity index 100% rename from Session/Images.xcassets/note-to-self-avatar.imageset/note-24@2x.png rename to Session/Meta/Images.xcassets/note-to-self-avatar.imageset/note-24@2x.png diff --git a/Session/Images.xcassets/note-to-self-avatar.imageset/note-24@3x.png b/Session/Meta/Images.xcassets/note-to-self-avatar.imageset/note-24@3x.png similarity index 100% rename from Session/Images.xcassets/note-to-self-avatar.imageset/note-24@3x.png rename to Session/Meta/Images.xcassets/note-to-self-avatar.imageset/note-24@3x.png diff --git a/Session/Images.xcassets/onboarding_splash_hero.imageset/Contents.json b/Session/Meta/Images.xcassets/onboarding_splash_hero.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/onboarding_splash_hero.imageset/Contents.json rename to Session/Meta/Images.xcassets/onboarding_splash_hero.imageset/Contents.json diff --git a/Session/Images.xcassets/onboarding_splash_hero.imageset/onboarding_splash.png b/Session/Meta/Images.xcassets/onboarding_splash_hero.imageset/onboarding_splash.png similarity index 100% rename from Session/Images.xcassets/onboarding_splash_hero.imageset/onboarding_splash.png rename to Session/Meta/Images.xcassets/onboarding_splash_hero.imageset/onboarding_splash.png diff --git a/Session/Images.xcassets/play_button.imageset/Contents.json b/Session/Meta/Images.xcassets/play_button.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/play_button.imageset/Contents.json rename to Session/Meta/Images.xcassets/play_button.imageset/Contents.json diff --git a/Session/Images.xcassets/play_button.imageset/play_button@2x.png b/Session/Meta/Images.xcassets/play_button.imageset/play_button@2x.png similarity index 100% rename from Session/Images.xcassets/play_button.imageset/play_button@2x.png rename to Session/Meta/Images.xcassets/play_button.imageset/play_button@2x.png diff --git a/Session/Images.xcassets/profile_avatar_default.imageset/Contents.json b/Session/Meta/Images.xcassets/profile_avatar_default.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/profile_avatar_default.imageset/Contents.json rename to Session/Meta/Images.xcassets/profile_avatar_default.imageset/Contents.json diff --git a/Session/Images.xcassets/profile_avatar_default.imageset/profile_avatar_default@1x.png b/Session/Meta/Images.xcassets/profile_avatar_default.imageset/profile_avatar_default@1x.png similarity index 100% rename from Session/Images.xcassets/profile_avatar_default.imageset/profile_avatar_default@1x.png rename to Session/Meta/Images.xcassets/profile_avatar_default.imageset/profile_avatar_default@1x.png diff --git a/Session/Images.xcassets/profile_avatar_default.imageset/profile_avatar_default@2x.png b/Session/Meta/Images.xcassets/profile_avatar_default.imageset/profile_avatar_default@2x.png similarity index 100% rename from Session/Images.xcassets/profile_avatar_default.imageset/profile_avatar_default@2x.png rename to Session/Meta/Images.xcassets/profile_avatar_default.imageset/profile_avatar_default@2x.png diff --git a/Session/Images.xcassets/profile_avatar_default.imageset/profile_avatar_default@3x.png b/Session/Meta/Images.xcassets/profile_avatar_default.imageset/profile_avatar_default@3x.png similarity index 100% rename from Session/Images.xcassets/profile_avatar_default.imageset/profile_avatar_default@3x.png rename to Session/Meta/Images.xcassets/profile_avatar_default.imageset/profile_avatar_default@3x.png diff --git a/Session/Images.xcassets/quoted-message-cancel.imageset/Contents.json b/Session/Meta/Images.xcassets/quoted-message-cancel.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/quoted-message-cancel.imageset/Contents.json rename to Session/Meta/Images.xcassets/quoted-message-cancel.imageset/Contents.json diff --git a/Session/Images.xcassets/quoted-message-cancel.imageset/quoted-message-cancel@1x.png b/Session/Meta/Images.xcassets/quoted-message-cancel.imageset/quoted-message-cancel@1x.png similarity index 100% rename from Session/Images.xcassets/quoted-message-cancel.imageset/quoted-message-cancel@1x.png rename to Session/Meta/Images.xcassets/quoted-message-cancel.imageset/quoted-message-cancel@1x.png diff --git a/Session/Images.xcassets/quoted-message-cancel.imageset/quoted-message-cancel@2x.png b/Session/Meta/Images.xcassets/quoted-message-cancel.imageset/quoted-message-cancel@2x.png similarity index 100% rename from Session/Images.xcassets/quoted-message-cancel.imageset/quoted-message-cancel@2x.png rename to Session/Meta/Images.xcassets/quoted-message-cancel.imageset/quoted-message-cancel@2x.png diff --git a/Session/Images.xcassets/quoted-message-cancel.imageset/quoted-message-cancel@3x.png b/Session/Meta/Images.xcassets/quoted-message-cancel.imageset/quoted-message-cancel@3x.png similarity index 100% rename from Session/Images.xcassets/quoted-message-cancel.imageset/quoted-message-cancel@3x.png rename to Session/Meta/Images.xcassets/quoted-message-cancel.imageset/quoted-message-cancel@3x.png diff --git a/Session/Images.xcassets/searchbar_clear.imageset/Contents.json b/Session/Meta/Images.xcassets/searchbar_clear.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/searchbar_clear.imageset/Contents.json rename to Session/Meta/Images.xcassets/searchbar_clear.imageset/Contents.json diff --git a/Session/Images.xcassets/searchbar_clear.imageset/Search-clear_17x17_@1x.png b/Session/Meta/Images.xcassets/searchbar_clear.imageset/Search-clear_17x17_@1x.png similarity index 100% rename from Session/Images.xcassets/searchbar_clear.imageset/Search-clear_17x17_@1x.png rename to Session/Meta/Images.xcassets/searchbar_clear.imageset/Search-clear_17x17_@1x.png diff --git a/Session/Images.xcassets/searchbar_clear.imageset/Search-clear_17x17_@2x.png b/Session/Meta/Images.xcassets/searchbar_clear.imageset/Search-clear_17x17_@2x.png similarity index 100% rename from Session/Images.xcassets/searchbar_clear.imageset/Search-clear_17x17_@2x.png rename to Session/Meta/Images.xcassets/searchbar_clear.imageset/Search-clear_17x17_@2x.png diff --git a/Session/Images.xcassets/searchbar_clear.imageset/Search-clear_17x17_@3x.png b/Session/Meta/Images.xcassets/searchbar_clear.imageset/Search-clear_17x17_@3x.png similarity index 100% rename from Session/Images.xcassets/searchbar_clear.imageset/Search-clear_17x17_@3x.png rename to Session/Meta/Images.xcassets/searchbar_clear.imageset/Search-clear_17x17_@3x.png diff --git a/Session/Images.xcassets/searchbar_search.imageset/Contents.json b/Session/Meta/Images.xcassets/searchbar_search.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/searchbar_search.imageset/Contents.json rename to Session/Meta/Images.xcassets/searchbar_search.imageset/Contents.json diff --git a/Session/Images.xcassets/searchbar_search.imageset/UIButtonBarSearch_18x18_@1x.png b/Session/Meta/Images.xcassets/searchbar_search.imageset/UIButtonBarSearch_18x18_@1x.png similarity index 100% rename from Session/Images.xcassets/searchbar_search.imageset/UIButtonBarSearch_18x18_@1x.png rename to Session/Meta/Images.xcassets/searchbar_search.imageset/UIButtonBarSearch_18x18_@1x.png diff --git a/Session/Images.xcassets/searchbar_search.imageset/UIButtonBarSearch_18x18_@2x.png b/Session/Meta/Images.xcassets/searchbar_search.imageset/UIButtonBarSearch_18x18_@2x.png similarity index 100% rename from Session/Images.xcassets/searchbar_search.imageset/UIButtonBarSearch_18x18_@2x.png rename to Session/Meta/Images.xcassets/searchbar_search.imageset/UIButtonBarSearch_18x18_@2x.png diff --git a/Session/Images.xcassets/searchbar_search.imageset/UIButtonBarSearch_18x18_@3x.png b/Session/Meta/Images.xcassets/searchbar_search.imageset/UIButtonBarSearch_18x18_@3x.png similarity index 100% rename from Session/Images.xcassets/searchbar_search.imageset/UIButtonBarSearch_18x18_@3x.png rename to Session/Meta/Images.xcassets/searchbar_search.imageset/UIButtonBarSearch_18x18_@3x.png diff --git a/Session/Images.xcassets/selected_blue_circle.imageset/BlueCheckSelected_31x31_@1x.png b/Session/Meta/Images.xcassets/selected_blue_circle.imageset/BlueCheckSelected_31x31_@1x.png similarity index 100% rename from Session/Images.xcassets/selected_blue_circle.imageset/BlueCheckSelected_31x31_@1x.png rename to Session/Meta/Images.xcassets/selected_blue_circle.imageset/BlueCheckSelected_31x31_@1x.png diff --git a/Session/Images.xcassets/selected_blue_circle.imageset/BlueCheckSelected_31x31_@2x.png b/Session/Meta/Images.xcassets/selected_blue_circle.imageset/BlueCheckSelected_31x31_@2x.png similarity index 100% rename from Session/Images.xcassets/selected_blue_circle.imageset/BlueCheckSelected_31x31_@2x.png rename to Session/Meta/Images.xcassets/selected_blue_circle.imageset/BlueCheckSelected_31x31_@2x.png diff --git a/Session/Images.xcassets/selected_blue_circle.imageset/BlueCheckSelected_31x31_@3x.png b/Session/Meta/Images.xcassets/selected_blue_circle.imageset/BlueCheckSelected_31x31_@3x.png similarity index 100% rename from Session/Images.xcassets/selected_blue_circle.imageset/BlueCheckSelected_31x31_@3x.png rename to Session/Meta/Images.xcassets/selected_blue_circle.imageset/BlueCheckSelected_31x31_@3x.png diff --git a/Session/Images.xcassets/selected_blue_circle.imageset/Contents.json b/Session/Meta/Images.xcassets/selected_blue_circle.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/selected_blue_circle.imageset/Contents.json rename to Session/Meta/Images.xcassets/selected_blue_circle.imageset/Contents.json diff --git a/Session/Images.xcassets/settings-avatar-camera-2.imageset/Contents.json b/Session/Meta/Images.xcassets/settings-avatar-camera-2.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/settings-avatar-camera-2.imageset/Contents.json rename to Session/Meta/Images.xcassets/settings-avatar-camera-2.imageset/Contents.json diff --git a/Session/Images.xcassets/settings-avatar-camera-2.imageset/camera-filled-24@1x.png b/Session/Meta/Images.xcassets/settings-avatar-camera-2.imageset/camera-filled-24@1x.png similarity index 100% rename from Session/Images.xcassets/settings-avatar-camera-2.imageset/camera-filled-24@1x.png rename to Session/Meta/Images.xcassets/settings-avatar-camera-2.imageset/camera-filled-24@1x.png diff --git a/Session/Images.xcassets/settings-avatar-camera-2.imageset/camera-filled-24@2x.png b/Session/Meta/Images.xcassets/settings-avatar-camera-2.imageset/camera-filled-24@2x.png similarity index 100% rename from Session/Images.xcassets/settings-avatar-camera-2.imageset/camera-filled-24@2x.png rename to Session/Meta/Images.xcassets/settings-avatar-camera-2.imageset/camera-filled-24@2x.png diff --git a/Session/Images.xcassets/settings-avatar-camera-2.imageset/camera-filled-24@3x.png b/Session/Meta/Images.xcassets/settings-avatar-camera-2.imageset/camera-filled-24@3x.png similarity index 100% rename from Session/Images.xcassets/settings-avatar-camera-2.imageset/camera-filled-24@3x.png rename to Session/Meta/Images.xcassets/settings-avatar-camera-2.imageset/camera-filled-24@3x.png diff --git a/Session/Images.xcassets/settings-avatar-camera.imageset/Contents.json b/Session/Meta/Images.xcassets/settings-avatar-camera.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/settings-avatar-camera.imageset/Contents.json rename to Session/Meta/Images.xcassets/settings-avatar-camera.imageset/Contents.json diff --git a/Session/Images.xcassets/settings-avatar-camera.imageset/settings-avatar-camera@1x.png b/Session/Meta/Images.xcassets/settings-avatar-camera.imageset/settings-avatar-camera@1x.png similarity index 100% rename from Session/Images.xcassets/settings-avatar-camera.imageset/settings-avatar-camera@1x.png rename to Session/Meta/Images.xcassets/settings-avatar-camera.imageset/settings-avatar-camera@1x.png diff --git a/Session/Images.xcassets/settings-avatar-camera.imageset/settings-avatar-camera@2x.png b/Session/Meta/Images.xcassets/settings-avatar-camera.imageset/settings-avatar-camera@2x.png similarity index 100% rename from Session/Images.xcassets/settings-avatar-camera.imageset/settings-avatar-camera@2x.png rename to Session/Meta/Images.xcassets/settings-avatar-camera.imageset/settings-avatar-camera@2x.png diff --git a/Session/Images.xcassets/settings-avatar-camera.imageset/settings-avatar-camera@3x.png b/Session/Meta/Images.xcassets/settings-avatar-camera.imageset/settings-avatar-camera@3x.png similarity index 100% rename from Session/Images.xcassets/settings-avatar-camera.imageset/settings-avatar-camera@3x.png rename to Session/Meta/Images.xcassets/settings-avatar-camera.imageset/settings-avatar-camera@3x.png diff --git a/Session/Images.xcassets/settings.imageset/Contents.json b/Session/Meta/Images.xcassets/settings.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/settings.imageset/Contents.json rename to Session/Meta/Images.xcassets/settings.imageset/Contents.json diff --git a/Session/Images.xcassets/settings.imageset/settings.pdf b/Session/Meta/Images.xcassets/settings.imageset/settings.pdf similarity index 100% rename from Session/Images.xcassets/settings.imageset/settings.pdf rename to Session/Meta/Images.xcassets/settings.imageset/settings.pdf diff --git a/Session/Images.xcassets/sliderProgressThumb.imageset/Contents.json b/Session/Meta/Images.xcassets/sliderProgressThumb.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/sliderProgressThumb.imageset/Contents.json rename to Session/Meta/Images.xcassets/sliderProgressThumb.imageset/Contents.json diff --git a/Session/Images.xcassets/sliderProgressThumb.imageset/VideoPlayer_Slider_Thumb_15x15_@1x.png b/Session/Meta/Images.xcassets/sliderProgressThumb.imageset/VideoPlayer_Slider_Thumb_15x15_@1x.png similarity index 100% rename from Session/Images.xcassets/sliderProgressThumb.imageset/VideoPlayer_Slider_Thumb_15x15_@1x.png rename to Session/Meta/Images.xcassets/sliderProgressThumb.imageset/VideoPlayer_Slider_Thumb_15x15_@1x.png diff --git a/Session/Images.xcassets/sliderProgressThumb.imageset/VideoPlayer_Slider_Thumb_15x15_@2x.png b/Session/Meta/Images.xcassets/sliderProgressThumb.imageset/VideoPlayer_Slider_Thumb_15x15_@2x.png similarity index 100% rename from Session/Images.xcassets/sliderProgressThumb.imageset/VideoPlayer_Slider_Thumb_15x15_@2x.png rename to Session/Meta/Images.xcassets/sliderProgressThumb.imageset/VideoPlayer_Slider_Thumb_15x15_@2x.png diff --git a/Session/Images.xcassets/sliderProgressThumb.imageset/VideoPlayer_Slider_Thumb_15x15_@3x.png b/Session/Meta/Images.xcassets/sliderProgressThumb.imageset/VideoPlayer_Slider_Thumb_15x15_@3x.png similarity index 100% rename from Session/Images.xcassets/sliderProgressThumb.imageset/VideoPlayer_Slider_Thumb_15x15_@3x.png rename to Session/Meta/Images.xcassets/sliderProgressThumb.imageset/VideoPlayer_Slider_Thumb_15x15_@3x.png diff --git a/Session/Images.xcassets/small_chevron_left.imageset/Contents.json b/Session/Meta/Images.xcassets/small_chevron_left.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/small_chevron_left.imageset/Contents.json rename to Session/Meta/Images.xcassets/small_chevron_left.imageset/Contents.json diff --git a/Session/Images.xcassets/small_chevron_left.imageset/chevron_left_16@1x.png b/Session/Meta/Images.xcassets/small_chevron_left.imageset/chevron_left_16@1x.png similarity index 100% rename from Session/Images.xcassets/small_chevron_left.imageset/chevron_left_16@1x.png rename to Session/Meta/Images.xcassets/small_chevron_left.imageset/chevron_left_16@1x.png diff --git a/Session/Images.xcassets/small_chevron_left.imageset/chevron_left_16@3x-1.png b/Session/Meta/Images.xcassets/small_chevron_left.imageset/chevron_left_16@3x-1.png similarity index 100% rename from Session/Images.xcassets/small_chevron_left.imageset/chevron_left_16@3x-1.png rename to Session/Meta/Images.xcassets/small_chevron_left.imageset/chevron_left_16@3x-1.png diff --git a/Session/Images.xcassets/small_chevron_left.imageset/chevron_left_16@3x.png b/Session/Meta/Images.xcassets/small_chevron_left.imageset/chevron_left_16@3x.png similarity index 100% rename from Session/Images.xcassets/small_chevron_left.imageset/chevron_left_16@3x.png rename to Session/Meta/Images.xcassets/small_chevron_left.imageset/chevron_left_16@3x.png diff --git a/Session/Images.xcassets/small_chevron_right.imageset/Contents.json b/Session/Meta/Images.xcassets/small_chevron_right.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/small_chevron_right.imageset/Contents.json rename to Session/Meta/Images.xcassets/small_chevron_right.imageset/Contents.json diff --git a/Session/Images.xcassets/small_chevron_right.imageset/chevron_right_16@1x.png b/Session/Meta/Images.xcassets/small_chevron_right.imageset/chevron_right_16@1x.png similarity index 100% rename from Session/Images.xcassets/small_chevron_right.imageset/chevron_right_16@1x.png rename to Session/Meta/Images.xcassets/small_chevron_right.imageset/chevron_right_16@1x.png diff --git a/Session/Images.xcassets/small_chevron_right.imageset/chevron_right_16@2x.png b/Session/Meta/Images.xcassets/small_chevron_right.imageset/chevron_right_16@2x.png similarity index 100% rename from Session/Images.xcassets/small_chevron_right.imageset/chevron_right_16@2x.png rename to Session/Meta/Images.xcassets/small_chevron_right.imageset/chevron_right_16@2x.png diff --git a/Session/Images.xcassets/small_chevron_right.imageset/chevron_right_16@3x.png b/Session/Meta/Images.xcassets/small_chevron_right.imageset/chevron_right_16@3x.png similarity index 100% rename from Session/Images.xcassets/small_chevron_right.imageset/chevron_right_16@3x.png rename to Session/Meta/Images.xcassets/small_chevron_right.imageset/chevron_right_16@3x.png diff --git a/Session/Images.xcassets/statJoinedGroup--blue.imageset/Contents.json b/Session/Meta/Images.xcassets/statJoinedGroup--blue.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/statJoinedGroup--blue.imageset/Contents.json rename to Session/Meta/Images.xcassets/statJoinedGroup--blue.imageset/Contents.json diff --git a/Session/Images.xcassets/statJoinedGroup--blue.imageset/statJoinedGroup--blue.pdf b/Session/Meta/Images.xcassets/statJoinedGroup--blue.imageset/statJoinedGroup--blue.pdf similarity index 100% rename from Session/Images.xcassets/statJoinedGroup--blue.imageset/statJoinedGroup--blue.pdf rename to Session/Meta/Images.xcassets/statJoinedGroup--blue.imageset/statJoinedGroup--blue.pdf diff --git a/Session/Images.xcassets/statLeftGroup--blue.imageset/Contents.json b/Session/Meta/Images.xcassets/statLeftGroup--blue.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/statLeftGroup--blue.imageset/Contents.json rename to Session/Meta/Images.xcassets/statLeftGroup--blue.imageset/Contents.json diff --git a/Session/Images.xcassets/statLeftGroup--blue.imageset/statLeftGroup--blue.pdf b/Session/Meta/Images.xcassets/statLeftGroup--blue.imageset/statLeftGroup--blue.pdf similarity index 100% rename from Session/Images.xcassets/statLeftGroup--blue.imageset/statLeftGroup--blue.pdf rename to Session/Meta/Images.xcassets/statLeftGroup--blue.imageset/statLeftGroup--blue.pdf diff --git a/Session/Images.xcassets/statRefreshedGroup--blue.imageset/Contents.json b/Session/Meta/Images.xcassets/statRefreshedGroup--blue.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/statRefreshedGroup--blue.imageset/Contents.json rename to Session/Meta/Images.xcassets/statRefreshedGroup--blue.imageset/Contents.json diff --git a/Session/Images.xcassets/statRefreshedGroup--blue.imageset/statRefreshedGroup--blue.pdf b/Session/Meta/Images.xcassets/statRefreshedGroup--blue.imageset/statRefreshedGroup--blue.pdf similarity index 100% rename from Session/Images.xcassets/statRefreshedGroup--blue.imageset/statRefreshedGroup--blue.pdf rename to Session/Meta/Images.xcassets/statRefreshedGroup--blue.imageset/statRefreshedGroup--blue.pdf diff --git a/Session/Images.xcassets/system_disclosure_indicator.imageset/Contents.json b/Session/Meta/Images.xcassets/system_disclosure_indicator.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/system_disclosure_indicator.imageset/Contents.json rename to Session/Meta/Images.xcassets/system_disclosure_indicator.imageset/Contents.json diff --git a/Session/Images.xcassets/system_disclosure_indicator.imageset/DisclosureIndicator@1x.png b/Session/Meta/Images.xcassets/system_disclosure_indicator.imageset/DisclosureIndicator@1x.png similarity index 100% rename from Session/Images.xcassets/system_disclosure_indicator.imageset/DisclosureIndicator@1x.png rename to Session/Meta/Images.xcassets/system_disclosure_indicator.imageset/DisclosureIndicator@1x.png diff --git a/Session/Images.xcassets/system_disclosure_indicator.imageset/DisclosureIndicator@2x.png b/Session/Meta/Images.xcassets/system_disclosure_indicator.imageset/DisclosureIndicator@2x.png similarity index 100% rename from Session/Images.xcassets/system_disclosure_indicator.imageset/DisclosureIndicator@2x.png rename to Session/Meta/Images.xcassets/system_disclosure_indicator.imageset/DisclosureIndicator@2x.png diff --git a/Session/Images.xcassets/system_disclosure_indicator.imageset/DisclosureIndicator@3x.png b/Session/Meta/Images.xcassets/system_disclosure_indicator.imageset/DisclosureIndicator@3x.png similarity index 100% rename from Session/Images.xcassets/system_disclosure_indicator.imageset/DisclosureIndicator@3x.png rename to Session/Meta/Images.xcassets/system_disclosure_indicator.imageset/DisclosureIndicator@3x.png diff --git a/Session/Images.xcassets/system_disclosure_indicator_rtl.imageset/Contents.json b/Session/Meta/Images.xcassets/system_disclosure_indicator_rtl.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/system_disclosure_indicator_rtl.imageset/Contents.json rename to Session/Meta/Images.xcassets/system_disclosure_indicator_rtl.imageset/Contents.json diff --git a/Session/Images.xcassets/system_disclosure_indicator_rtl.imageset/DisclosureIndicatorRTL@1x.png b/Session/Meta/Images.xcassets/system_disclosure_indicator_rtl.imageset/DisclosureIndicatorRTL@1x.png similarity index 100% rename from Session/Images.xcassets/system_disclosure_indicator_rtl.imageset/DisclosureIndicatorRTL@1x.png rename to Session/Meta/Images.xcassets/system_disclosure_indicator_rtl.imageset/DisclosureIndicatorRTL@1x.png diff --git a/Session/Images.xcassets/system_disclosure_indicator_rtl.imageset/DisclosureIndicatorRTL@2x.png b/Session/Meta/Images.xcassets/system_disclosure_indicator_rtl.imageset/DisclosureIndicatorRTL@2x.png similarity index 100% rename from Session/Images.xcassets/system_disclosure_indicator_rtl.imageset/DisclosureIndicatorRTL@2x.png rename to Session/Meta/Images.xcassets/system_disclosure_indicator_rtl.imageset/DisclosureIndicatorRTL@2x.png diff --git a/Session/Images.xcassets/system_disclosure_indicator_rtl.imageset/DisclosureIndicatorRTL@3x.png b/Session/Meta/Images.xcassets/system_disclosure_indicator_rtl.imageset/DisclosureIndicatorRTL@3x.png similarity index 100% rename from Session/Images.xcassets/system_disclosure_indicator_rtl.imageset/DisclosureIndicatorRTL@3x.png rename to Session/Meta/Images.xcassets/system_disclosure_indicator_rtl.imageset/DisclosureIndicatorRTL@3x.png diff --git a/Session/Images.xcassets/system_message_call.imageset/Contents.json b/Session/Meta/Images.xcassets/system_message_call.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/system_message_call.imageset/Contents.json rename to Session/Meta/Images.xcassets/system_message_call.imageset/Contents.json diff --git a/Session/Images.xcassets/system_message_call.imageset/system_message_call@1x.png b/Session/Meta/Images.xcassets/system_message_call.imageset/system_message_call@1x.png similarity index 100% rename from Session/Images.xcassets/system_message_call.imageset/system_message_call@1x.png rename to Session/Meta/Images.xcassets/system_message_call.imageset/system_message_call@1x.png diff --git a/Session/Images.xcassets/system_message_call.imageset/system_message_call@2x.png b/Session/Meta/Images.xcassets/system_message_call.imageset/system_message_call@2x.png similarity index 100% rename from Session/Images.xcassets/system_message_call.imageset/system_message_call@2x.png rename to Session/Meta/Images.xcassets/system_message_call.imageset/system_message_call@2x.png diff --git a/Session/Images.xcassets/system_message_call.imageset/system_message_call@3x.png b/Session/Meta/Images.xcassets/system_message_call.imageset/system_message_call@3x.png similarity index 100% rename from Session/Images.xcassets/system_message_call.imageset/system_message_call@3x.png rename to Session/Meta/Images.xcassets/system_message_call.imageset/system_message_call@3x.png diff --git a/Session/Images.xcassets/system_message_disappearing_messages.imageset/Contents.json b/Session/Meta/Images.xcassets/system_message_disappearing_messages.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/system_message_disappearing_messages.imageset/Contents.json rename to Session/Meta/Images.xcassets/system_message_disappearing_messages.imageset/Contents.json diff --git a/Session/Images.xcassets/system_message_disappearing_messages.imageset/timer-20@1x.png b/Session/Meta/Images.xcassets/system_message_disappearing_messages.imageset/timer-20@1x.png similarity index 100% rename from Session/Images.xcassets/system_message_disappearing_messages.imageset/timer-20@1x.png rename to Session/Meta/Images.xcassets/system_message_disappearing_messages.imageset/timer-20@1x.png diff --git a/Session/Images.xcassets/system_message_disappearing_messages.imageset/timer-20@2x.png b/Session/Meta/Images.xcassets/system_message_disappearing_messages.imageset/timer-20@2x.png similarity index 100% rename from Session/Images.xcassets/system_message_disappearing_messages.imageset/timer-20@2x.png rename to Session/Meta/Images.xcassets/system_message_disappearing_messages.imageset/timer-20@2x.png diff --git a/Session/Images.xcassets/system_message_disappearing_messages.imageset/timer-20@3x.png b/Session/Meta/Images.xcassets/system_message_disappearing_messages.imageset/timer-20@3x.png similarity index 100% rename from Session/Images.xcassets/system_message_disappearing_messages.imageset/timer-20@3x.png rename to Session/Meta/Images.xcassets/system_message_disappearing_messages.imageset/timer-20@3x.png diff --git a/Session/Images.xcassets/system_message_disappearing_messages_disabled.imageset/Contents.json b/Session/Meta/Images.xcassets/system_message_disappearing_messages_disabled.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/system_message_disappearing_messages_disabled.imageset/Contents.json rename to Session/Meta/Images.xcassets/system_message_disappearing_messages_disabled.imageset/Contents.json diff --git a/Session/Images.xcassets/system_message_disappearing_messages_disabled.imageset/timer-disabled-20@1x.png b/Session/Meta/Images.xcassets/system_message_disappearing_messages_disabled.imageset/timer-disabled-20@1x.png similarity index 100% rename from Session/Images.xcassets/system_message_disappearing_messages_disabled.imageset/timer-disabled-20@1x.png rename to Session/Meta/Images.xcassets/system_message_disappearing_messages_disabled.imageset/timer-disabled-20@1x.png diff --git a/Session/Images.xcassets/system_message_disappearing_messages_disabled.imageset/timer-disabled-20@2x.png b/Session/Meta/Images.xcassets/system_message_disappearing_messages_disabled.imageset/timer-disabled-20@2x.png similarity index 100% rename from Session/Images.xcassets/system_message_disappearing_messages_disabled.imageset/timer-disabled-20@2x.png rename to Session/Meta/Images.xcassets/system_message_disappearing_messages_disabled.imageset/timer-disabled-20@2x.png diff --git a/Session/Images.xcassets/system_message_disappearing_messages_disabled.imageset/timer-disabled-20@3x.png b/Session/Meta/Images.xcassets/system_message_disappearing_messages_disabled.imageset/timer-disabled-20@3x.png similarity index 100% rename from Session/Images.xcassets/system_message_disappearing_messages_disabled.imageset/timer-disabled-20@3x.png rename to Session/Meta/Images.xcassets/system_message_disappearing_messages_disabled.imageset/timer-disabled-20@3x.png diff --git a/Session/Images.xcassets/system_message_security.imageset/Contents.json b/Session/Meta/Images.xcassets/system_message_security.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/system_message_security.imageset/Contents.json rename to Session/Meta/Images.xcassets/system_message_security.imageset/Contents.json diff --git a/Session/Images.xcassets/system_message_security.imageset/system_message_security@1x.png b/Session/Meta/Images.xcassets/system_message_security.imageset/system_message_security@1x.png similarity index 100% rename from Session/Images.xcassets/system_message_security.imageset/system_message_security@1x.png rename to Session/Meta/Images.xcassets/system_message_security.imageset/system_message_security@1x.png diff --git a/Session/Images.xcassets/system_message_security.imageset/system_message_security@2x.png b/Session/Meta/Images.xcassets/system_message_security.imageset/system_message_security@2x.png similarity index 100% rename from Session/Images.xcassets/system_message_security.imageset/system_message_security@2x.png rename to Session/Meta/Images.xcassets/system_message_security.imageset/system_message_security@2x.png diff --git a/Session/Images.xcassets/system_message_security.imageset/system_message_security@3x.png b/Session/Meta/Images.xcassets/system_message_security.imageset/system_message_security@3x.png similarity index 100% rename from Session/Images.xcassets/system_message_security.imageset/system_message_security@3x.png rename to Session/Meta/Images.xcassets/system_message_security.imageset/system_message_security@3x.png diff --git a/Session/Images.xcassets/system_message_verified.imageset/Contents.json b/Session/Meta/Images.xcassets/system_message_verified.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/system_message_verified.imageset/Contents.json rename to Session/Meta/Images.xcassets/system_message_verified.imageset/Contents.json diff --git a/Session/Images.xcassets/system_message_verified.imageset/system_message_verified@1x.png b/Session/Meta/Images.xcassets/system_message_verified.imageset/system_message_verified@1x.png similarity index 100% rename from Session/Images.xcassets/system_message_verified.imageset/system_message_verified@1x.png rename to Session/Meta/Images.xcassets/system_message_verified.imageset/system_message_verified@1x.png diff --git a/Session/Images.xcassets/system_message_verified.imageset/system_message_verified@2x.png b/Session/Meta/Images.xcassets/system_message_verified.imageset/system_message_verified@2x.png similarity index 100% rename from Session/Images.xcassets/system_message_verified.imageset/system_message_verified@2x.png rename to Session/Meta/Images.xcassets/system_message_verified.imageset/system_message_verified@2x.png diff --git a/Session/Images.xcassets/system_message_verified.imageset/system_message_verified@3x.png b/Session/Meta/Images.xcassets/system_message_verified.imageset/system_message_verified@3x.png similarity index 100% rename from Session/Images.xcassets/system_message_verified.imageset/system_message_verified@3x.png rename to Session/Meta/Images.xcassets/system_message_verified.imageset/system_message_verified@3x.png diff --git a/Session/Images.xcassets/table_ic_add_to_existing_contact.imageset/Contents.json b/Session/Meta/Images.xcassets/table_ic_add_to_existing_contact.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/table_ic_add_to_existing_contact.imageset/Contents.json rename to Session/Meta/Images.xcassets/table_ic_add_to_existing_contact.imageset/Contents.json diff --git a/Session/Images.xcassets/table_ic_add_to_existing_contact.imageset/table_ic_add_to_existing_contact@1x.png b/Session/Meta/Images.xcassets/table_ic_add_to_existing_contact.imageset/table_ic_add_to_existing_contact@1x.png similarity index 100% rename from Session/Images.xcassets/table_ic_add_to_existing_contact.imageset/table_ic_add_to_existing_contact@1x.png rename to Session/Meta/Images.xcassets/table_ic_add_to_existing_contact.imageset/table_ic_add_to_existing_contact@1x.png diff --git a/Session/Images.xcassets/table_ic_add_to_existing_contact.imageset/table_ic_add_to_existing_contact@2x.png b/Session/Meta/Images.xcassets/table_ic_add_to_existing_contact.imageset/table_ic_add_to_existing_contact@2x.png similarity index 100% rename from Session/Images.xcassets/table_ic_add_to_existing_contact.imageset/table_ic_add_to_existing_contact@2x.png rename to Session/Meta/Images.xcassets/table_ic_add_to_existing_contact.imageset/table_ic_add_to_existing_contact@2x.png diff --git a/Session/Images.xcassets/table_ic_add_to_existing_contact.imageset/table_ic_add_to_existing_contact@3x.png b/Session/Meta/Images.xcassets/table_ic_add_to_existing_contact.imageset/table_ic_add_to_existing_contact@3x.png similarity index 100% rename from Session/Images.xcassets/table_ic_add_to_existing_contact.imageset/table_ic_add_to_existing_contact@3x.png rename to Session/Meta/Images.xcassets/table_ic_add_to_existing_contact.imageset/table_ic_add_to_existing_contact@3x.png diff --git a/Session/Images.xcassets/table_ic_block.imageset/Contents.json b/Session/Meta/Images.xcassets/table_ic_block.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/table_ic_block.imageset/Contents.json rename to Session/Meta/Images.xcassets/table_ic_block.imageset/Contents.json diff --git a/Session/Images.xcassets/table_ic_block.imageset/table_ic_block@1x.png b/Session/Meta/Images.xcassets/table_ic_block.imageset/table_ic_block@1x.png similarity index 100% rename from Session/Images.xcassets/table_ic_block.imageset/table_ic_block@1x.png rename to Session/Meta/Images.xcassets/table_ic_block.imageset/table_ic_block@1x.png diff --git a/Session/Images.xcassets/table_ic_block.imageset/table_ic_block@2x.png b/Session/Meta/Images.xcassets/table_ic_block.imageset/table_ic_block@2x.png similarity index 100% rename from Session/Images.xcassets/table_ic_block.imageset/table_ic_block@2x.png rename to Session/Meta/Images.xcassets/table_ic_block.imageset/table_ic_block@2x.png diff --git a/Session/Images.xcassets/table_ic_block.imageset/table_ic_block@3x.png b/Session/Meta/Images.xcassets/table_ic_block.imageset/table_ic_block@3x.png similarity index 100% rename from Session/Images.xcassets/table_ic_block.imageset/table_ic_block@3x.png rename to Session/Meta/Images.xcassets/table_ic_block.imageset/table_ic_block@3x.png diff --git a/Session/Images.xcassets/table_ic_group_edit.imageset/Contents.json b/Session/Meta/Images.xcassets/table_ic_group_edit.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/table_ic_group_edit.imageset/Contents.json rename to Session/Meta/Images.xcassets/table_ic_group_edit.imageset/Contents.json diff --git a/Session/Images.xcassets/table_ic_group_edit.imageset/table_ic_group_edit@1x.png b/Session/Meta/Images.xcassets/table_ic_group_edit.imageset/table_ic_group_edit@1x.png similarity index 100% rename from Session/Images.xcassets/table_ic_group_edit.imageset/table_ic_group_edit@1x.png rename to Session/Meta/Images.xcassets/table_ic_group_edit.imageset/table_ic_group_edit@1x.png diff --git a/Session/Images.xcassets/table_ic_group_edit.imageset/table_ic_group_edit@2x.png b/Session/Meta/Images.xcassets/table_ic_group_edit.imageset/table_ic_group_edit@2x.png similarity index 100% rename from Session/Images.xcassets/table_ic_group_edit.imageset/table_ic_group_edit@2x.png rename to Session/Meta/Images.xcassets/table_ic_group_edit.imageset/table_ic_group_edit@2x.png diff --git a/Session/Images.xcassets/table_ic_group_edit.imageset/table_ic_group_edit@3x.png b/Session/Meta/Images.xcassets/table_ic_group_edit.imageset/table_ic_group_edit@3x.png similarity index 100% rename from Session/Images.xcassets/table_ic_group_edit.imageset/table_ic_group_edit@3x.png rename to Session/Meta/Images.xcassets/table_ic_group_edit.imageset/table_ic_group_edit@3x.png diff --git a/Session/Images.xcassets/table_ic_group_leave.imageset/Contents.json b/Session/Meta/Images.xcassets/table_ic_group_leave.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/table_ic_group_leave.imageset/Contents.json rename to Session/Meta/Images.xcassets/table_ic_group_leave.imageset/Contents.json diff --git a/Session/Images.xcassets/table_ic_group_leave.imageset/table_ic_group_leave@1x.png b/Session/Meta/Images.xcassets/table_ic_group_leave.imageset/table_ic_group_leave@1x.png similarity index 100% rename from Session/Images.xcassets/table_ic_group_leave.imageset/table_ic_group_leave@1x.png rename to Session/Meta/Images.xcassets/table_ic_group_leave.imageset/table_ic_group_leave@1x.png diff --git a/Session/Images.xcassets/table_ic_group_leave.imageset/table_ic_group_leave@2x.png b/Session/Meta/Images.xcassets/table_ic_group_leave.imageset/table_ic_group_leave@2x.png similarity index 100% rename from Session/Images.xcassets/table_ic_group_leave.imageset/table_ic_group_leave@2x.png rename to Session/Meta/Images.xcassets/table_ic_group_leave.imageset/table_ic_group_leave@2x.png diff --git a/Session/Images.xcassets/table_ic_group_leave.imageset/table_ic_group_leave@3x.png b/Session/Meta/Images.xcassets/table_ic_group_leave.imageset/table_ic_group_leave@3x.png similarity index 100% rename from Session/Images.xcassets/table_ic_group_leave.imageset/table_ic_group_leave@3x.png rename to Session/Meta/Images.xcassets/table_ic_group_leave.imageset/table_ic_group_leave@3x.png diff --git a/Session/Images.xcassets/table_ic_group_members.imageset/Contents.json b/Session/Meta/Images.xcassets/table_ic_group_members.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/table_ic_group_members.imageset/Contents.json rename to Session/Meta/Images.xcassets/table_ic_group_members.imageset/Contents.json diff --git a/Session/Images.xcassets/table_ic_group_members.imageset/table_ic_group_members@1x.png b/Session/Meta/Images.xcassets/table_ic_group_members.imageset/table_ic_group_members@1x.png similarity index 100% rename from Session/Images.xcassets/table_ic_group_members.imageset/table_ic_group_members@1x.png rename to Session/Meta/Images.xcassets/table_ic_group_members.imageset/table_ic_group_members@1x.png diff --git a/Session/Images.xcassets/table_ic_group_members.imageset/table_ic_group_members@2x.png b/Session/Meta/Images.xcassets/table_ic_group_members.imageset/table_ic_group_members@2x.png similarity index 100% rename from Session/Images.xcassets/table_ic_group_members.imageset/table_ic_group_members@2x.png rename to Session/Meta/Images.xcassets/table_ic_group_members.imageset/table_ic_group_members@2x.png diff --git a/Session/Images.xcassets/table_ic_group_members.imageset/table_ic_group_members@3x.png b/Session/Meta/Images.xcassets/table_ic_group_members.imageset/table_ic_group_members@3x.png similarity index 100% rename from Session/Images.xcassets/table_ic_group_members.imageset/table_ic_group_members@3x.png rename to Session/Meta/Images.xcassets/table_ic_group_members.imageset/table_ic_group_members@3x.png diff --git a/Session/Images.xcassets/table_ic_mute_thread.imageset/Contents.json b/Session/Meta/Images.xcassets/table_ic_mute_thread.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/table_ic_mute_thread.imageset/Contents.json rename to Session/Meta/Images.xcassets/table_ic_mute_thread.imageset/Contents.json diff --git a/Session/Images.xcassets/table_ic_mute_thread.imageset/table_ic_mute_thread@1x.png b/Session/Meta/Images.xcassets/table_ic_mute_thread.imageset/table_ic_mute_thread@1x.png similarity index 100% rename from Session/Images.xcassets/table_ic_mute_thread.imageset/table_ic_mute_thread@1x.png rename to Session/Meta/Images.xcassets/table_ic_mute_thread.imageset/table_ic_mute_thread@1x.png diff --git a/Session/Images.xcassets/table_ic_mute_thread.imageset/table_ic_mute_thread@2x.png b/Session/Meta/Images.xcassets/table_ic_mute_thread.imageset/table_ic_mute_thread@2x.png similarity index 100% rename from Session/Images.xcassets/table_ic_mute_thread.imageset/table_ic_mute_thread@2x.png rename to Session/Meta/Images.xcassets/table_ic_mute_thread.imageset/table_ic_mute_thread@2x.png diff --git a/Session/Images.xcassets/table_ic_mute_thread.imageset/table_ic_mute_thread@3x.png b/Session/Meta/Images.xcassets/table_ic_mute_thread.imageset/table_ic_mute_thread@3x.png similarity index 100% rename from Session/Images.xcassets/table_ic_mute_thread.imageset/table_ic_mute_thread@3x.png rename to Session/Meta/Images.xcassets/table_ic_mute_thread.imageset/table_ic_mute_thread@3x.png diff --git a/Session/Images.xcassets/table_ic_new_contact.imageset/Contents.json b/Session/Meta/Images.xcassets/table_ic_new_contact.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/table_ic_new_contact.imageset/Contents.json rename to Session/Meta/Images.xcassets/table_ic_new_contact.imageset/Contents.json diff --git a/Session/Images.xcassets/table_ic_new_contact.imageset/table_ic_new_contact@1x.png b/Session/Meta/Images.xcassets/table_ic_new_contact.imageset/table_ic_new_contact@1x.png similarity index 100% rename from Session/Images.xcassets/table_ic_new_contact.imageset/table_ic_new_contact@1x.png rename to Session/Meta/Images.xcassets/table_ic_new_contact.imageset/table_ic_new_contact@1x.png diff --git a/Session/Images.xcassets/table_ic_new_contact.imageset/table_ic_new_contact@2x.png b/Session/Meta/Images.xcassets/table_ic_new_contact.imageset/table_ic_new_contact@2x.png similarity index 100% rename from Session/Images.xcassets/table_ic_new_contact.imageset/table_ic_new_contact@2x.png rename to Session/Meta/Images.xcassets/table_ic_new_contact.imageset/table_ic_new_contact@2x.png diff --git a/Session/Images.xcassets/table_ic_new_contact.imageset/table_ic_new_contact@3x.png b/Session/Meta/Images.xcassets/table_ic_new_contact.imageset/table_ic_new_contact@3x.png similarity index 100% rename from Session/Images.xcassets/table_ic_new_contact.imageset/table_ic_new_contact@3x.png rename to Session/Meta/Images.xcassets/table_ic_new_contact.imageset/table_ic_new_contact@3x.png diff --git a/Session/Images.xcassets/table_ic_not_verified.imageset/Contents.json b/Session/Meta/Images.xcassets/table_ic_not_verified.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/table_ic_not_verified.imageset/Contents.json rename to Session/Meta/Images.xcassets/table_ic_not_verified.imageset/Contents.json diff --git a/Session/Images.xcassets/table_ic_not_verified.imageset/table_ic_not_verified@1x.png b/Session/Meta/Images.xcassets/table_ic_not_verified.imageset/table_ic_not_verified@1x.png similarity index 100% rename from Session/Images.xcassets/table_ic_not_verified.imageset/table_ic_not_verified@1x.png rename to Session/Meta/Images.xcassets/table_ic_not_verified.imageset/table_ic_not_verified@1x.png diff --git a/Session/Images.xcassets/table_ic_not_verified.imageset/table_ic_not_verified@2x.png b/Session/Meta/Images.xcassets/table_ic_not_verified.imageset/table_ic_not_verified@2x.png similarity index 100% rename from Session/Images.xcassets/table_ic_not_verified.imageset/table_ic_not_verified@2x.png rename to Session/Meta/Images.xcassets/table_ic_not_verified.imageset/table_ic_not_verified@2x.png diff --git a/Session/Images.xcassets/table_ic_not_verified.imageset/table_ic_not_verified@3x.png b/Session/Meta/Images.xcassets/table_ic_not_verified.imageset/table_ic_not_verified@3x.png similarity index 100% rename from Session/Images.xcassets/table_ic_not_verified.imageset/table_ic_not_verified@3x.png rename to Session/Meta/Images.xcassets/table_ic_not_verified.imageset/table_ic_not_verified@3x.png diff --git a/Session/Images.xcassets/table_ic_notification_sound.imageset/Contents.json b/Session/Meta/Images.xcassets/table_ic_notification_sound.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/table_ic_notification_sound.imageset/Contents.json rename to Session/Meta/Images.xcassets/table_ic_notification_sound.imageset/Contents.json diff --git a/Session/Images.xcassets/table_ic_notification_sound.imageset/table_ic_notification_sound@1x.png b/Session/Meta/Images.xcassets/table_ic_notification_sound.imageset/table_ic_notification_sound@1x.png similarity index 100% rename from Session/Images.xcassets/table_ic_notification_sound.imageset/table_ic_notification_sound@1x.png rename to Session/Meta/Images.xcassets/table_ic_notification_sound.imageset/table_ic_notification_sound@1x.png diff --git a/Session/Images.xcassets/table_ic_notification_sound.imageset/table_ic_notification_sound@2x.png b/Session/Meta/Images.xcassets/table_ic_notification_sound.imageset/table_ic_notification_sound@2x.png similarity index 100% rename from Session/Images.xcassets/table_ic_notification_sound.imageset/table_ic_notification_sound@2x.png rename to Session/Meta/Images.xcassets/table_ic_notification_sound.imageset/table_ic_notification_sound@2x.png diff --git a/Session/Images.xcassets/table_ic_notification_sound.imageset/table_ic_notification_sound@3x.png b/Session/Meta/Images.xcassets/table_ic_notification_sound.imageset/table_ic_notification_sound@3x.png similarity index 100% rename from Session/Images.xcassets/table_ic_notification_sound.imageset/table_ic_notification_sound@3x.png rename to Session/Meta/Images.xcassets/table_ic_notification_sound.imageset/table_ic_notification_sound@3x.png diff --git a/Session/Images.xcassets/table_ic_share_profile.imageset/Contents.json b/Session/Meta/Images.xcassets/table_ic_share_profile.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/table_ic_share_profile.imageset/Contents.json rename to Session/Meta/Images.xcassets/table_ic_share_profile.imageset/Contents.json diff --git a/Session/Images.xcassets/table_ic_share_profile.imageset/table_ic_share_profile@1x.png b/Session/Meta/Images.xcassets/table_ic_share_profile.imageset/table_ic_share_profile@1x.png similarity index 100% rename from Session/Images.xcassets/table_ic_share_profile.imageset/table_ic_share_profile@1x.png rename to Session/Meta/Images.xcassets/table_ic_share_profile.imageset/table_ic_share_profile@1x.png diff --git a/Session/Images.xcassets/table_ic_share_profile.imageset/table_ic_share_profile@2x.png b/Session/Meta/Images.xcassets/table_ic_share_profile.imageset/table_ic_share_profile@2x.png similarity index 100% rename from Session/Images.xcassets/table_ic_share_profile.imageset/table_ic_share_profile@2x.png rename to Session/Meta/Images.xcassets/table_ic_share_profile.imageset/table_ic_share_profile@2x.png diff --git a/Session/Images.xcassets/table_ic_share_profile.imageset/table_ic_share_profile@3x.png b/Session/Meta/Images.xcassets/table_ic_share_profile.imageset/table_ic_share_profile@3x.png similarity index 100% rename from Session/Images.xcassets/table_ic_share_profile.imageset/table_ic_share_profile@3x.png rename to Session/Meta/Images.xcassets/table_ic_share_profile.imageset/table_ic_share_profile@3x.png diff --git a/Session/Images.xcassets/table_ic_verify.imageset/Contents.json b/Session/Meta/Images.xcassets/table_ic_verify.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/table_ic_verify.imageset/Contents.json rename to Session/Meta/Images.xcassets/table_ic_verify.imageset/Contents.json diff --git a/Session/Images.xcassets/table_ic_verify.imageset/table_ic_verify@1x.png b/Session/Meta/Images.xcassets/table_ic_verify.imageset/table_ic_verify@1x.png similarity index 100% rename from Session/Images.xcassets/table_ic_verify.imageset/table_ic_verify@1x.png rename to Session/Meta/Images.xcassets/table_ic_verify.imageset/table_ic_verify@1x.png diff --git a/Session/Images.xcassets/table_ic_verify.imageset/table_ic_verify@2x.png b/Session/Meta/Images.xcassets/table_ic_verify.imageset/table_ic_verify@2x.png similarity index 100% rename from Session/Images.xcassets/table_ic_verify.imageset/table_ic_verify@2x.png rename to Session/Meta/Images.xcassets/table_ic_verify.imageset/table_ic_verify@2x.png diff --git a/Session/Images.xcassets/table_ic_verify.imageset/table_ic_verify@3x.png b/Session/Meta/Images.xcassets/table_ic_verify.imageset/table_ic_verify@3x.png similarity index 100% rename from Session/Images.xcassets/table_ic_verify.imageset/table_ic_verify@3x.png rename to Session/Meta/Images.xcassets/table_ic_verify.imageset/table_ic_verify@3x.png diff --git a/Session/Images.xcassets/twitter_logo.imageset/Contents.json b/Session/Meta/Images.xcassets/twitter_logo.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/twitter_logo.imageset/Contents.json rename to Session/Meta/Images.xcassets/twitter_logo.imageset/Contents.json diff --git a/Session/Images.xcassets/twitter_logo.imageset/twitter_logo.pdf b/Session/Meta/Images.xcassets/twitter_logo.imageset/twitter_logo.pdf similarity index 100% rename from Session/Images.xcassets/twitter_logo.imageset/twitter_logo.pdf rename to Session/Meta/Images.xcassets/twitter_logo.imageset/twitter_logo.pdf diff --git a/Session/Images.xcassets/twitter_sharing_image.imageset/Contents.json b/Session/Meta/Images.xcassets/twitter_sharing_image.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/twitter_sharing_image.imageset/Contents.json rename to Session/Meta/Images.xcassets/twitter_sharing_image.imageset/Contents.json diff --git a/Session/Images.xcassets/twitter_sharing_image.imageset/logo_with_background.png b/Session/Meta/Images.xcassets/twitter_sharing_image.imageset/logo_with_background.png similarity index 100% rename from Session/Images.xcassets/twitter_sharing_image.imageset/logo_with_background.png rename to Session/Meta/Images.xcassets/twitter_sharing_image.imageset/logo_with_background.png diff --git a/Session/Images.xcassets/twitter_sharing_image.imageset/logo_with_background@2x.png b/Session/Meta/Images.xcassets/twitter_sharing_image.imageset/logo_with_background@2x.png similarity index 100% rename from Session/Images.xcassets/twitter_sharing_image.imageset/logo_with_background@2x.png rename to Session/Meta/Images.xcassets/twitter_sharing_image.imageset/logo_with_background@2x.png diff --git a/Session/Images.xcassets/twitter_sharing_image.imageset/logo_with_background@3x.png b/Session/Meta/Images.xcassets/twitter_sharing_image.imageset/logo_with_background@3x.png similarity index 100% rename from Session/Images.xcassets/twitter_sharing_image.imageset/logo_with_background@3x.png rename to Session/Meta/Images.xcassets/twitter_sharing_image.imageset/logo_with_background@3x.png diff --git a/Session/Images.xcassets/uiEmpty.imageset/Contents.json b/Session/Meta/Images.xcassets/uiEmpty.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/uiEmpty.imageset/Contents.json rename to Session/Meta/Images.xcassets/uiEmpty.imageset/Contents.json diff --git a/Session/Images.xcassets/uiEmpty.imageset/uiEmpty.pdf b/Session/Meta/Images.xcassets/uiEmpty.imageset/uiEmpty.pdf similarity index 100% rename from Session/Images.xcassets/uiEmpty.imageset/uiEmpty.pdf rename to Session/Meta/Images.xcassets/uiEmpty.imageset/uiEmpty.pdf diff --git a/Session/Images.xcassets/uiEmptyContact.imageset/Contents.json b/Session/Meta/Images.xcassets/uiEmptyContact.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/uiEmptyContact.imageset/Contents.json rename to Session/Meta/Images.xcassets/uiEmptyContact.imageset/Contents.json diff --git a/Session/Images.xcassets/uiEmptyContact.imageset/uiEmptyContact.pdf b/Session/Meta/Images.xcassets/uiEmptyContact.imageset/uiEmptyContact.pdf similarity index 100% rename from Session/Images.xcassets/uiEmptyContact.imageset/uiEmptyContact.pdf rename to Session/Meta/Images.xcassets/uiEmptyContact.imageset/uiEmptyContact.pdf diff --git a/Session/Images.xcassets/video-mute-selected.imageset/Contents.json b/Session/Meta/Images.xcassets/video-mute-selected.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/video-mute-selected.imageset/Contents.json rename to Session/Meta/Images.xcassets/video-mute-selected.imageset/Contents.json diff --git a/Session/Images.xcassets/video-mute-selected.imageset/video-mute-selected.png b/Session/Meta/Images.xcassets/video-mute-selected.imageset/video-mute-selected.png similarity index 100% rename from Session/Images.xcassets/video-mute-selected.imageset/video-mute-selected.png rename to Session/Meta/Images.xcassets/video-mute-selected.imageset/video-mute-selected.png diff --git a/Session/Images.xcassets/video-mute-unselected.imageset/Contents.json b/Session/Meta/Images.xcassets/video-mute-unselected.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/video-mute-unselected.imageset/Contents.json rename to Session/Meta/Images.xcassets/video-mute-unselected.imageset/Contents.json diff --git a/Session/Images.xcassets/video-mute-unselected.imageset/video-mute-unselected.png b/Session/Meta/Images.xcassets/video-mute-unselected.imageset/video-mute-unselected.png similarity index 100% rename from Session/Images.xcassets/video-mute-unselected.imageset/video-mute-unselected.png rename to Session/Meta/Images.xcassets/video-mute-unselected.imageset/video-mute-unselected.png diff --git a/Session/Images.xcassets/video-switch-camera-unselected.imageset/Contents.json b/Session/Meta/Images.xcassets/video-switch-camera-unselected.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/video-switch-camera-unselected.imageset/Contents.json rename to Session/Meta/Images.xcassets/video-switch-camera-unselected.imageset/Contents.json diff --git a/Session/Images.xcassets/video-switch-camera-unselected.imageset/switch_camera_large.png b/Session/Meta/Images.xcassets/video-switch-camera-unselected.imageset/switch_camera_large.png similarity index 100% rename from Session/Images.xcassets/video-switch-camera-unselected.imageset/switch_camera_large.png rename to Session/Meta/Images.xcassets/video-switch-camera-unselected.imageset/switch_camera_large.png diff --git a/Session/Images.xcassets/video-video-selected.imageset/Contents.json b/Session/Meta/Images.xcassets/video-video-selected.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/video-video-selected.imageset/Contents.json rename to Session/Meta/Images.xcassets/video-video-selected.imageset/Contents.json diff --git a/Session/Images.xcassets/video-video-selected.imageset/video-video-selected.png b/Session/Meta/Images.xcassets/video-video-selected.imageset/video-video-selected.png similarity index 100% rename from Session/Images.xcassets/video-video-selected.imageset/video-video-selected.png rename to Session/Meta/Images.xcassets/video-video-selected.imageset/video-video-selected.png diff --git a/Session/Images.xcassets/video-video-unselected.imageset/Contents.json b/Session/Meta/Images.xcassets/video-video-unselected.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/video-video-unselected.imageset/Contents.json rename to Session/Meta/Images.xcassets/video-video-unselected.imageset/Contents.json diff --git a/Session/Images.xcassets/video-video-unselected.imageset/video-video-unselected.png b/Session/Meta/Images.xcassets/video-video-unselected.imageset/video-video-unselected.png similarity index 100% rename from Session/Images.xcassets/video-video-unselected.imageset/video-video-unselected.png rename to Session/Meta/Images.xcassets/video-video-unselected.imageset/video-video-unselected.png diff --git a/Session/Images.xcassets/voice-memo-button.imageset/Contents.json b/Session/Meta/Images.xcassets/voice-memo-button.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/voice-memo-button.imageset/Contents.json rename to Session/Meta/Images.xcassets/voice-memo-button.imageset/Contents.json diff --git a/Session/Images.xcassets/voice-memo-button.imageset/voice-memo-button-32.png b/Session/Meta/Images.xcassets/voice-memo-button.imageset/voice-memo-button-32.png similarity index 100% rename from Session/Images.xcassets/voice-memo-button.imageset/voice-memo-button-32.png rename to Session/Meta/Images.xcassets/voice-memo-button.imageset/voice-memo-button-32.png diff --git a/Session/Images.xcassets/voice-memo-button.imageset/voice-memo-button-64.png b/Session/Meta/Images.xcassets/voice-memo-button.imageset/voice-memo-button-64.png similarity index 100% rename from Session/Images.xcassets/voice-memo-button.imageset/voice-memo-button-64.png rename to Session/Meta/Images.xcassets/voice-memo-button.imageset/voice-memo-button-64.png diff --git a/Session/Images.xcassets/voice-memo-button.imageset/voice-memo-button-96.png b/Session/Meta/Images.xcassets/voice-memo-button.imageset/voice-memo-button-96.png similarity index 100% rename from Session/Images.xcassets/voice-memo-button.imageset/voice-memo-button-96.png rename to Session/Meta/Images.xcassets/voice-memo-button.imageset/voice-memo-button-96.png diff --git a/Session/Images.xcassets/voice-message-large-white.imageset/Contents.json b/Session/Meta/Images.xcassets/voice-message-large-white.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/voice-message-large-white.imageset/Contents.json rename to Session/Meta/Images.xcassets/voice-message-large-white.imageset/Contents.json diff --git a/Session/Images.xcassets/voice-message-large-white.imageset/voice-message-large-white@1x.png b/Session/Meta/Images.xcassets/voice-message-large-white.imageset/voice-message-large-white@1x.png similarity index 100% rename from Session/Images.xcassets/voice-message-large-white.imageset/voice-message-large-white@1x.png rename to Session/Meta/Images.xcassets/voice-message-large-white.imageset/voice-message-large-white@1x.png diff --git a/Session/Images.xcassets/voice-message-large-white.imageset/voice-message-large-white@2x.png b/Session/Meta/Images.xcassets/voice-message-large-white.imageset/voice-message-large-white@2x.png similarity index 100% rename from Session/Images.xcassets/voice-message-large-white.imageset/voice-message-large-white@2x.png rename to Session/Meta/Images.xcassets/voice-message-large-white.imageset/voice-message-large-white@2x.png diff --git a/Session/Images.xcassets/voice-message-large-white.imageset/voice-message-large-white@3x.png b/Session/Meta/Images.xcassets/voice-message-large-white.imageset/voice-message-large-white@3x.png similarity index 100% rename from Session/Images.xcassets/voice-message-large-white.imageset/voice-message-large-white@3x.png rename to Session/Meta/Images.xcassets/voice-message-large-white.imageset/voice-message-large-white@3x.png diff --git a/Session/Images.xcassets/x-24.imageset/Contents.json b/Session/Meta/Images.xcassets/x-24.imageset/Contents.json similarity index 100% rename from Session/Images.xcassets/x-24.imageset/Contents.json rename to Session/Meta/Images.xcassets/x-24.imageset/Contents.json diff --git a/Session/Images.xcassets/x-24.imageset/x-24@1x.png b/Session/Meta/Images.xcassets/x-24.imageset/x-24@1x.png similarity index 100% rename from Session/Images.xcassets/x-24.imageset/x-24@1x.png rename to Session/Meta/Images.xcassets/x-24.imageset/x-24@1x.png diff --git a/Session/Images.xcassets/x-24.imageset/x-24@2x.png b/Session/Meta/Images.xcassets/x-24.imageset/x-24@2x.png similarity index 100% rename from Session/Images.xcassets/x-24.imageset/x-24@2x.png rename to Session/Meta/Images.xcassets/x-24.imageset/x-24@2x.png diff --git a/Session/Images.xcassets/x-24.imageset/x-24@3x.png b/Session/Meta/Images.xcassets/x-24.imageset/x-24@3x.png similarity index 100% rename from Session/Images.xcassets/x-24.imageset/x-24@3x.png rename to Session/Meta/Images.xcassets/x-24.imageset/x-24@3x.png diff --git a/Session/Images/audio_pause_button.png b/Session/Meta/Images/audio_pause_button.png similarity index 100% rename from Session/Images/audio_pause_button.png rename to Session/Meta/Images/audio_pause_button.png diff --git a/Session/Images/audio_pause_button@2x.png b/Session/Meta/Images/audio_pause_button@2x.png similarity index 100% rename from Session/Images/audio_pause_button@2x.png rename to Session/Meta/Images/audio_pause_button@2x.png diff --git a/Session/Images/audio_pause_button_blue.png b/Session/Meta/Images/audio_pause_button_blue.png similarity index 100% rename from Session/Images/audio_pause_button_blue.png rename to Session/Meta/Images/audio_pause_button_blue.png diff --git a/Session/Images/audio_pause_button_blue@2x.png b/Session/Meta/Images/audio_pause_button_blue@2x.png similarity index 100% rename from Session/Images/audio_pause_button_blue@2x.png rename to Session/Meta/Images/audio_pause_button_blue@2x.png diff --git a/Session/Images/audio_play_button.png b/Session/Meta/Images/audio_play_button.png similarity index 100% rename from Session/Images/audio_play_button.png rename to Session/Meta/Images/audio_play_button.png diff --git a/Session/Images/audio_play_button@2x.png b/Session/Meta/Images/audio_play_button@2x.png similarity index 100% rename from Session/Images/audio_play_button@2x.png rename to Session/Meta/Images/audio_play_button@2x.png diff --git a/Session/Images/audio_play_button_blue.png b/Session/Meta/Images/audio_play_button_blue.png similarity index 100% rename from Session/Images/audio_play_button_blue.png rename to Session/Meta/Images/audio_play_button_blue.png diff --git a/Session/Images/audio_play_button_blue@2x.png b/Session/Meta/Images/audio_play_button_blue@2x.png similarity index 100% rename from Session/Images/audio_play_button_blue@2x.png rename to Session/Meta/Images/audio_play_button_blue@2x.png diff --git a/Session/Images/call@2x.png b/Session/Meta/Images/call@2x.png similarity index 100% rename from Session/Images/call@2x.png rename to Session/Meta/Images/call@2x.png diff --git a/Session/Images/contact_default_feed.png b/Session/Meta/Images/contact_default_feed.png similarity index 100% rename from Session/Images/contact_default_feed.png rename to Session/Meta/Images/contact_default_feed.png diff --git a/Session/Images/endcall@2x.png b/Session/Meta/Images/endcall@2x.png similarity index 100% rename from Session/Images/endcall@2x.png rename to Session/Meta/Images/endcall@2x.png diff --git a/Session/Images/error_white@2x.png b/Session/Meta/Images/error_white@2x.png similarity index 100% rename from Session/Images/error_white@2x.png rename to Session/Meta/Images/error_white@2x.png diff --git a/Session/Images/mute_off@2x.png b/Session/Meta/Images/mute_off@2x.png similarity index 100% rename from Session/Images/mute_off@2x.png rename to Session/Meta/Images/mute_off@2x.png diff --git a/Session/Images/mute_on@2x.png b/Session/Meta/Images/mute_on@2x.png similarity index 100% rename from Session/Images/mute_on@2x.png rename to Session/Meta/Images/mute_on@2x.png diff --git a/Session/Images/pause_icon.png b/Session/Meta/Images/pause_icon.png similarity index 100% rename from Session/Images/pause_icon.png rename to Session/Meta/Images/pause_icon.png diff --git a/Session/Images/pause_icon@2x.png b/Session/Meta/Images/pause_icon@2x.png similarity index 100% rename from Session/Images/pause_icon@2x.png rename to Session/Meta/Images/pause_icon@2x.png diff --git a/Session/Images/play_icon.png b/Session/Meta/Images/play_icon.png similarity index 100% rename from Session/Images/play_icon.png rename to Session/Meta/Images/play_icon.png diff --git a/Session/Images/play_icon@2x.png b/Session/Meta/Images/play_icon@2x.png similarity index 100% rename from Session/Images/play_icon@2x.png rename to Session/Meta/Images/play_icon@2x.png diff --git a/Session/Images/qr@2x.png b/Session/Meta/Images/qr@2x.png similarity index 100% rename from Session/Images/qr@2x.png rename to Session/Meta/Images/qr@2x.png diff --git a/Session/Images/quit@2x.png b/Session/Meta/Images/quit@2x.png similarity index 100% rename from Session/Images/quit@2x.png rename to Session/Meta/Images/quit@2x.png diff --git a/Session/Images/savephoto@2x.png b/Session/Meta/Images/savephoto@2x.png similarity index 100% rename from Session/Images/savephoto@2x.png rename to Session/Meta/Images/savephoto@2x.png diff --git a/Session/Images/typing-animation-dark.gif b/Session/Meta/Images/typing-animation-dark.gif similarity index 100% rename from Session/Images/typing-animation-dark.gif rename to Session/Meta/Images/typing-animation-dark.gif diff --git a/Session/Images/typing-animation.gif b/Session/Meta/Images/typing-animation.gif similarity index 100% rename from Session/Images/typing-animation.gif rename to Session/Meta/Images/typing-animation.gif diff --git a/Session/Images/warning_white@2x.png b/Session/Meta/Images/warning_white@2x.png similarity index 100% rename from Session/Images/warning_white@2x.png rename to Session/Meta/Images/warning_white@2x.png diff --git a/SettingsBundle/Settings.bundle/Acknowledgements.plist b/Session/Meta/Settings.bundle/Acknowledgements.plist similarity index 100% rename from SettingsBundle/Settings.bundle/Acknowledgements.plist rename to Session/Meta/Settings.bundle/Acknowledgements.plist diff --git a/SettingsBundle/Settings.bundle/Root.plist b/Session/Meta/Settings.bundle/Root.plist similarity index 100% rename from SettingsBundle/Settings.bundle/Root.plist rename to Session/Meta/Settings.bundle/Root.plist diff --git a/SettingsBundle/Settings.bundle/en.lproj/Acknowledgements.strings b/Session/Meta/Settings.bundle/en.lproj/Acknowledgements.strings similarity index 100% rename from SettingsBundle/Settings.bundle/en.lproj/Acknowledgements.strings rename to Session/Meta/Settings.bundle/en.lproj/Acknowledgements.strings diff --git a/SettingsBundle/Settings.bundle/en.lproj/Root.strings b/Session/Meta/Settings.bundle/en.lproj/Root.strings similarity index 100% rename from SettingsBundle/Settings.bundle/en.lproj/Root.strings rename to Session/Meta/Settings.bundle/en.lproj/Root.strings diff --git a/Session/src/Signal-Bridging-Header.h b/Session/Meta/Signal-Bridging-Header.h similarity index 98% rename from Session/src/Signal-Bridging-Header.h rename to Session/Meta/Signal-Bridging-Header.h index 5ed1b41bf..517bbc064 100644 --- a/Session/src/Signal-Bridging-Header.h +++ b/Session/Meta/Signal-Bridging-Header.h @@ -16,8 +16,6 @@ #import "ConversationViewCell.h" #import "ConversationViewItem.h" #import "DateUtil.h" -#import "DebugUIPage.h" -#import "DebugUITableViewController.h" #import "FingerprintViewController.h" #import "MediaDetailViewController.h" #import "NotificationSettingsViewController.h" diff --git a/Session/Signal-Info.plist b/Session/Meta/Signal-Info.plist similarity index 100% rename from Session/Signal-Info.plist rename to Session/Meta/Signal-Info.plist diff --git a/Session/Signal-Prefix.pch b/Session/Meta/Signal-Prefix.pch similarity index 100% rename from Session/Signal-Prefix.pch rename to Session/Meta/Signal-Prefix.pch diff --git a/Session/Signal.entitlements b/Session/Meta/Signal.entitlements similarity index 100% rename from Session/Signal.entitlements rename to Session/Meta/Signal.entitlements diff --git a/Session/SignalTSan.supp b/Session/Meta/SignalTSan.supp similarity index 100% rename from Session/SignalTSan.supp rename to Session/Meta/SignalTSan.supp diff --git a/Session/SignalUBSan.supp b/Session/Meta/SignalUBSan.supp similarity index 100% rename from Session/SignalUBSan.supp rename to Session/Meta/SignalUBSan.supp diff --git a/Session/translations/.tx/config b/Session/Meta/Translations/.tx/config similarity index 100% rename from Session/translations/.tx/config rename to Session/Meta/Translations/.tx/config diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/an_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/an_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/an_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/an_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/ar_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/ar_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/ar_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/ar_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/bg_BG_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/bg_BG_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/bg_BG_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/bg_BG_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/ca_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/ca_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/ca_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/ca_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/cs_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/cs_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/cs_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/cs_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/da_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/da_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/da_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/da_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/de_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/de_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/de_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/de_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/es_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/es_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/es_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/es_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/eu_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/eu_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/eu_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/eu_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/fa_IR_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/fa_IR_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/fa_IR_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/fa_IR_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/fa_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/fa_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/fa_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/fa_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/fi_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/fi_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/fi_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/fi_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/fil_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/fil_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/fil_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/fil_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/fr_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/fr_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/fr_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/fr_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/he_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/he_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/he_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/he_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/hu_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/hu_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/hu_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/hu_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/it_IT_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/it_IT_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/it_IT_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/it_IT_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/ja_JP_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/ja_JP_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/ja_JP_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/ja_JP_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/lv_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/lv_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/lv_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/lv_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/nb_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/nb_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/nb_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/nb_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/nl_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/nl_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/nl_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/nl_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/pl_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/pl_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/pl_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/pl_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/pt_BR_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/pt_BR_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/pt_BR_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/pt_BR_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/ro_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/ro_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/ro_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/ro_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/ru_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/ru_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/ru_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/ru_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/sl_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/sl_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/sl_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/sl_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/sq_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/sq_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/sq_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/sq_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/sv_SE_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/sv_SE_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/sv_SE_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/sv_SE_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/ta_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/ta_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/ta_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/ta_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/tr_TR_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/tr_TR_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/tr_TR_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/tr_TR_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/uk_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/uk_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/uk_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/uk_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/zh_CN_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/zh_CN_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/zh_CN_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/zh_CN_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/zh_TW.Big5_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/zh_TW.Big5_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/zh_TW.Big5_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/zh_TW.Big5_translation diff --git a/Session/translations/.tx/signal-ios.localizablestrings-30/zh_TW_translation b/Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/zh_TW_translation similarity index 100% rename from Session/translations/.tx/signal-ios.localizablestrings-30/zh_TW_translation rename to Session/Meta/Translations/.tx/signal-ios.localizablestrings-30/zh_TW_translation diff --git a/Session/Migrating Translations from Android.md b/Session/Meta/Translations/Migrating Translations from Android.md similarity index 100% rename from Session/Migrating Translations from Android.md rename to Session/Meta/Translations/Migrating Translations from Android.md diff --git a/Session/translations/TRANSLATIONS.md b/Session/Meta/Translations/TRANSLATIONS.md similarity index 100% rename from Session/translations/TRANSLATIONS.md rename to Session/Meta/Translations/TRANSLATIONS.md diff --git a/Session/translations/bin/auto-genstrings b/Session/Meta/Translations/bin/auto-genstrings similarity index 100% rename from Session/translations/bin/auto-genstrings rename to Session/Meta/Translations/bin/auto-genstrings diff --git a/Session/translations/bin/pull-translations b/Session/Meta/Translations/bin/pull-translations similarity index 100% rename from Session/translations/bin/pull-translations rename to Session/Meta/Translations/bin/pull-translations diff --git a/Session/translations/bin/push-translation-source b/Session/Meta/Translations/bin/push-translation-source similarity index 100% rename from Session/translations/bin/push-translation-source rename to Session/Meta/Translations/bin/push-translation-source diff --git a/Session/translations/bin/sync-translations b/Session/Meta/Translations/bin/sync-translations similarity index 100% rename from Session/translations/bin/sync-translations rename to Session/Meta/Translations/bin/sync-translations diff --git a/Session/translations/de.lproj/Localizable.strings b/Session/Meta/Translations/de.lproj/Localizable.strings similarity index 100% rename from Session/translations/de.lproj/Localizable.strings rename to Session/Meta/Translations/de.lproj/Localizable.strings diff --git a/Session/translations/en.lproj/Localizable.strings b/Session/Meta/Translations/en.lproj/Localizable.strings similarity index 100% rename from Session/translations/en.lproj/Localizable.strings rename to Session/Meta/Translations/en.lproj/Localizable.strings diff --git a/Session/translations/es.lproj/Localizable.strings b/Session/Meta/Translations/es.lproj/Localizable.strings similarity index 100% rename from Session/translations/es.lproj/Localizable.strings rename to Session/Meta/Translations/es.lproj/Localizable.strings diff --git a/Session/translations/fa.lproj/Localizable.strings b/Session/Meta/Translations/fa.lproj/Localizable.strings similarity index 100% rename from Session/translations/fa.lproj/Localizable.strings rename to Session/Meta/Translations/fa.lproj/Localizable.strings diff --git a/Session/translations/fr.lproj/Localizable.strings b/Session/Meta/Translations/fr.lproj/Localizable.strings similarity index 100% rename from Session/translations/fr.lproj/Localizable.strings rename to Session/Meta/Translations/fr.lproj/Localizable.strings diff --git a/Session/translations/id-ID.lproj/Localizable.strings b/Session/Meta/Translations/id-ID.lproj/Localizable.strings similarity index 100% rename from Session/translations/id-ID.lproj/Localizable.strings rename to Session/Meta/Translations/id-ID.lproj/Localizable.strings diff --git a/Session/translations/it.lproj/Localizable.strings b/Session/Meta/Translations/it.lproj/Localizable.strings similarity index 100% rename from Session/translations/it.lproj/Localizable.strings rename to Session/Meta/Translations/it.lproj/Localizable.strings diff --git a/Session/translations/ja.lproj/Localizable.strings b/Session/Meta/Translations/ja.lproj/Localizable.strings similarity index 100% rename from Session/translations/ja.lproj/Localizable.strings rename to Session/Meta/Translations/ja.lproj/Localizable.strings diff --git a/Session/translations/pl.lproj/Localizable.strings b/Session/Meta/Translations/pl.lproj/Localizable.strings similarity index 100% rename from Session/translations/pl.lproj/Localizable.strings rename to Session/Meta/Translations/pl.lproj/Localizable.strings diff --git a/Session/translations/pt_BR.lproj/Localizable.strings b/Session/Meta/Translations/pt_BR.lproj/Localizable.strings similarity index 100% rename from Session/translations/pt_BR.lproj/Localizable.strings rename to Session/Meta/Translations/pt_BR.lproj/Localizable.strings diff --git a/Session/translations/ru.lproj/Localizable.strings b/Session/Meta/Translations/ru.lproj/Localizable.strings similarity index 100% rename from Session/translations/ru.lproj/Localizable.strings rename to Session/Meta/Translations/ru.lproj/Localizable.strings diff --git a/Session/translations/vi-VN.lproj/Localizable.strings b/Session/Meta/Translations/vi-VN.lproj/Localizable.strings similarity index 100% rename from Session/translations/vi-VN.lproj/Localizable.strings rename to Session/Meta/Translations/vi-VN.lproj/Localizable.strings diff --git a/Session/translations/zh_CN.lproj/Localizable.strings b/Session/Meta/Translations/zh_CN.lproj/Localizable.strings similarity index 100% rename from Session/translations/zh_CN.lproj/Localizable.strings rename to Session/Meta/Translations/zh_CN.lproj/Localizable.strings diff --git a/Session/main.m b/Session/Meta/main.m similarity index 100% rename from Session/main.m rename to Session/Meta/main.m diff --git a/Session/src/util/UI Categories/AVAudioSession+OWS.h b/Session/Signal/AVAudioSession+OWS.h similarity index 100% rename from Session/src/util/UI Categories/AVAudioSession+OWS.h rename to Session/Signal/AVAudioSession+OWS.h diff --git a/Session/src/util/UI Categories/AVAudioSession+OWS.m b/Session/Signal/AVAudioSession+OWS.m similarity index 100% rename from Session/src/util/UI Categories/AVAudioSession+OWS.m rename to Session/Signal/AVAudioSession+OWS.m diff --git a/Session/src/ViewControllers/AppSettings/AboutTableViewController.h b/Session/Signal/AboutTableViewController.h similarity index 100% rename from Session/src/ViewControllers/AppSettings/AboutTableViewController.h rename to Session/Signal/AboutTableViewController.h diff --git a/Session/src/ViewControllers/AppSettings/AboutTableViewController.m b/Session/Signal/AboutTableViewController.m similarity index 100% rename from Session/src/ViewControllers/AppSettings/AboutTableViewController.m rename to Session/Signal/AboutTableViewController.m diff --git a/Session/src/Models/AccountManager.swift b/Session/Signal/AccountManager.swift similarity index 100% rename from Session/src/Models/AccountManager.swift rename to Session/Signal/AccountManager.swift diff --git a/Session/src/ViewControllers/AddContactShareToExistingContactViewController.swift b/Session/Signal/AddContactShareToExistingContactViewController.swift similarity index 100% rename from Session/src/ViewControllers/AddContactShareToExistingContactViewController.swift rename to Session/Signal/AddContactShareToExistingContactViewController.swift diff --git a/Session/src/ViewControllers/AppSettings/AddToBlockListViewController.h b/Session/Signal/AddToBlockListViewController.h similarity index 100% rename from Session/src/ViewControllers/AppSettings/AddToBlockListViewController.h rename to Session/Signal/AddToBlockListViewController.h diff --git a/Session/src/ViewControllers/AppSettings/AddToBlockListViewController.m b/Session/Signal/AddToBlockListViewController.m similarity index 100% rename from Session/src/ViewControllers/AppSettings/AddToBlockListViewController.m rename to Session/Signal/AddToBlockListViewController.m diff --git a/Session/src/ViewControllers/ThreadSettings/AddToGroupViewController.h b/Session/Signal/AddToGroupViewController.h similarity index 100% rename from Session/src/ViewControllers/ThreadSettings/AddToGroupViewController.h rename to Session/Signal/AddToGroupViewController.h diff --git a/Session/src/ViewControllers/ThreadSettings/AddToGroupViewController.m b/Session/Signal/AddToGroupViewController.m similarity index 100% rename from Session/src/ViewControllers/ThreadSettings/AddToGroupViewController.m rename to Session/Signal/AddToGroupViewController.m diff --git a/Session/src/ViewControllers/AppSettings/AdvancedSettingsTableViewController.h b/Session/Signal/AdvancedSettingsTableViewController.h similarity index 100% rename from Session/src/ViewControllers/AppSettings/AdvancedSettingsTableViewController.h rename to Session/Signal/AdvancedSettingsTableViewController.h diff --git a/Session/src/ViewControllers/AppSettings/AdvancedSettingsTableViewController.m b/Session/Signal/AdvancedSettingsTableViewController.m similarity index 100% rename from Session/src/ViewControllers/AppSettings/AdvancedSettingsTableViewController.m rename to Session/Signal/AdvancedSettingsTableViewController.m diff --git a/Session/src/AppDelegate.h b/Session/Signal/AppDelegate.h similarity index 100% rename from Session/src/AppDelegate.h rename to Session/Signal/AppDelegate.h diff --git a/Session/src/AppDelegate.m b/Session/Signal/AppDelegate.m similarity index 100% rename from Session/src/AppDelegate.m rename to Session/Signal/AppDelegate.m diff --git a/Session/src/environment/AppEnvironment.swift b/Session/Signal/AppEnvironment.swift similarity index 100% rename from Session/src/environment/AppEnvironment.swift rename to Session/Signal/AppEnvironment.swift diff --git a/Session/src/UserInterface/Notifications/AppNotifications.swift b/Session/Signal/AppNotifications.swift similarity index 100% rename from Session/src/UserInterface/Notifications/AppNotifications.swift rename to Session/Signal/AppNotifications.swift diff --git a/Session/src/util/AppUpdateNag.swift b/Session/Signal/AppUpdateNag.swift similarity index 100% rename from Session/src/util/AppUpdateNag.swift rename to Session/Signal/AppUpdateNag.swift diff --git a/Session/src/views/AudioProgressView.swift b/Session/Signal/AudioProgressView.swift similarity index 100% rename from Session/src/views/AudioProgressView.swift rename to Session/Signal/AudioProgressView.swift diff --git a/Session/src/views/AvatarTableViewCell.swift b/Session/Signal/AvatarTableViewCell.swift similarity index 100% rename from Session/src/views/AvatarTableViewCell.swift rename to Session/Signal/AvatarTableViewCell.swift diff --git a/Session/src/ViewControllers/AvatarViewHelper.h b/Session/Signal/AvatarViewHelper.h similarity index 100% rename from Session/src/ViewControllers/AvatarViewHelper.h rename to Session/Signal/AvatarViewHelper.h diff --git a/Session/src/ViewControllers/AvatarViewHelper.m b/Session/Signal/AvatarViewHelper.m similarity index 100% rename from Session/src/ViewControllers/AvatarViewHelper.m rename to Session/Signal/AvatarViewHelper.m diff --git a/Session/src/ViewControllers/Registration/BackupRestoreViewController.swift b/Session/Signal/BackupRestoreViewController.swift similarity index 100% rename from Session/src/ViewControllers/Registration/BackupRestoreViewController.swift rename to Session/Signal/BackupRestoreViewController.swift diff --git a/Session/src/ViewControllers/AppSettings/BlockListViewController.h b/Session/Signal/BlockListViewController.h similarity index 100% rename from Session/src/ViewControllers/AppSettings/BlockListViewController.h rename to Session/Signal/BlockListViewController.h diff --git a/Session/src/ViewControllers/AppSettings/BlockListViewController.m b/Session/Signal/BlockListViewController.m similarity index 100% rename from Session/src/ViewControllers/AppSettings/BlockListViewController.m rename to Session/Signal/BlockListViewController.m diff --git a/Session/src/call/CallAudioService.swift b/Session/Signal/CallAudioService.swift similarity index 100% rename from Session/src/call/CallAudioService.swift rename to Session/Signal/CallAudioService.swift diff --git a/Session/src/call/Speakerbox/CallKitCallManager.swift b/Session/Signal/CallKitCallManager.swift similarity index 100% rename from Session/src/call/Speakerbox/CallKitCallManager.swift rename to Session/Signal/CallKitCallManager.swift diff --git a/Session/src/call/Speakerbox/CallKitCallUIAdaptee.swift b/Session/Signal/CallKitCallUIAdaptee.swift similarity index 100% rename from Session/src/call/Speakerbox/CallKitCallUIAdaptee.swift rename to Session/Signal/CallKitCallUIAdaptee.swift diff --git a/Session/src/call/CallService.swift b/Session/Signal/CallService.swift similarity index 100% rename from Session/src/call/CallService.swift rename to Session/Signal/CallService.swift diff --git a/Session/src/call/UserInterface/CallUIAdapter.swift b/Session/Signal/CallUIAdapter.swift similarity index 100% rename from Session/src/call/UserInterface/CallUIAdapter.swift rename to Session/Signal/CallUIAdapter.swift diff --git a/Session/src/ViewControllers/Call/CallVideoHintView.swift b/Session/Signal/CallVideoHintView.swift similarity index 98% rename from Session/src/ViewControllers/Call/CallVideoHintView.swift rename to Session/Signal/CallVideoHintView.swift index 4a6809e97..ba49030d0 100644 --- a/Session/src/ViewControllers/Call/CallVideoHintView.swift +++ b/Session/Signal/CallVideoHintView.swift @@ -23,7 +23,7 @@ class CallVideoHintView: UIView { tapGesture = UITapGestureRecognizer(target: self, action: #selector(didTap(tapGesture:))) addGestureRecognizer(tapGesture) - let layerView = OWSLayerView() + let layerView = OWSLayerView(frame: .zero) { _ in } let shapeLayer = CAShapeLayer() shapeLayer.fillColor = UIColor.ows_signalBlue.cgColor layerView.layer.addSublayer(shapeLayer) diff --git a/Session/src/ViewControllers/Call/CallViewController.swift b/Session/Signal/CallViewController.swift similarity index 100% rename from Session/src/ViewControllers/Call/CallViewController.swift rename to Session/Signal/CallViewController.swift diff --git a/Session/src/views/CaptionView.swift b/Session/Signal/CaptionView.swift similarity index 100% rename from Session/src/views/CaptionView.swift rename to Session/Signal/CaptionView.swift diff --git a/Session/src/ViewControllers/ColorPickerViewController.swift b/Session/Signal/ColorPickerViewController.swift similarity index 100% rename from Session/src/ViewControllers/ColorPickerViewController.swift rename to Session/Signal/ColorPickerViewController.swift diff --git a/Session/src/Models/CompareSafetyNumbersActivity.swift b/Session/Signal/CompareSafetyNumbersActivity.swift similarity index 100% rename from Session/src/Models/CompareSafetyNumbersActivity.swift rename to Session/Signal/CompareSafetyNumbersActivity.swift diff --git a/Session/src/views/ContactCell.swift b/Session/Signal/ContactCell.swift similarity index 100% rename from Session/src/views/ContactCell.swift rename to Session/Signal/ContactCell.swift diff --git a/Session/src/ViewControllers/ContactShareViewHelper.swift b/Session/Signal/ContactShareViewHelper.swift similarity index 100% rename from Session/src/ViewControllers/ContactShareViewHelper.swift rename to Session/Signal/ContactShareViewHelper.swift diff --git a/Session/src/ViewControllers/ContactViewController.swift b/Session/Signal/ContactViewController.swift similarity index 100% rename from Session/src/ViewControllers/ContactViewController.swift rename to Session/Signal/ContactViewController.swift diff --git a/Session/src/ViewControllers/ContactsPicker.swift b/Session/Signal/ContactsPicker.swift similarity index 100% rename from Session/src/ViewControllers/ContactsPicker.swift rename to Session/Signal/ContactsPicker.swift diff --git a/Session/src/Jobs/ConversationConfigurationSyncOperation.swift b/Session/Signal/ConversationConfigurationSyncOperation.swift similarity index 100% rename from Session/src/Jobs/ConversationConfigurationSyncOperation.swift rename to Session/Signal/ConversationConfigurationSyncOperation.swift diff --git a/Session/src/ConversationSearch.swift b/Session/Signal/ConversationSearch.swift similarity index 100% rename from Session/src/ConversationSearch.swift rename to Session/Signal/ConversationSearch.swift diff --git a/Session/src/ViewControllers/ConversationView/Cells/AttachmentUploadView.h b/Session/Signal/ConversationView/Cells/AttachmentUploadView.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/AttachmentUploadView.h rename to Session/Signal/ConversationView/Cells/AttachmentUploadView.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/AttachmentUploadView.m b/Session/Signal/ConversationView/Cells/AttachmentUploadView.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/AttachmentUploadView.m rename to Session/Signal/ConversationView/Cells/AttachmentUploadView.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/ConversationMediaView.swift b/Session/Signal/ConversationView/Cells/ConversationMediaView.swift similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/ConversationMediaView.swift rename to Session/Signal/ConversationView/Cells/ConversationMediaView.swift diff --git a/Session/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h b/Session/Signal/ConversationView/Cells/ConversationViewCell.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h rename to Session/Signal/ConversationView/Cells/ConversationViewCell.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/ConversationViewCell.m b/Session/Signal/ConversationView/Cells/ConversationViewCell.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/ConversationViewCell.m rename to Session/Signal/ConversationView/Cells/ConversationViewCell.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/MediaAlbumCellView.swift b/Session/Signal/ConversationView/Cells/MediaAlbumCellView.swift similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/MediaAlbumCellView.swift rename to Session/Signal/ConversationView/Cells/MediaAlbumCellView.swift diff --git a/Session/src/ViewControllers/ConversationView/Cells/MediaDownloadView.swift b/Session/Signal/ConversationView/Cells/MediaDownloadView.swift similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/MediaDownloadView.swift rename to Session/Signal/ConversationView/Cells/MediaDownloadView.swift diff --git a/Session/src/ViewControllers/ConversationView/Cells/MediaUploadView.swift b/Session/Signal/ConversationView/Cells/MediaUploadView.swift similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/MediaUploadView.swift rename to Session/Signal/ConversationView/Cells/MediaUploadView.swift diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSBubbleShapeView.h b/Session/Signal/ConversationView/Cells/OWSBubbleShapeView.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSBubbleShapeView.h rename to Session/Signal/ConversationView/Cells/OWSBubbleShapeView.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSBubbleShapeView.m b/Session/Signal/ConversationView/Cells/OWSBubbleShapeView.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSBubbleShapeView.m rename to Session/Signal/ConversationView/Cells/OWSBubbleShapeView.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSBubbleView.h b/Session/Signal/ConversationView/Cells/OWSBubbleView.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSBubbleView.h rename to Session/Signal/ConversationView/Cells/OWSBubbleView.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSBubbleView.m b/Session/Signal/ConversationView/Cells/OWSBubbleView.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSBubbleView.m rename to Session/Signal/ConversationView/Cells/OWSBubbleView.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSContactOffersCell.h b/Session/Signal/ConversationView/Cells/OWSContactOffersCell.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSContactOffersCell.h rename to Session/Signal/ConversationView/Cells/OWSContactOffersCell.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSContactOffersCell.m b/Session/Signal/ConversationView/Cells/OWSContactOffersCell.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSContactOffersCell.m rename to Session/Signal/ConversationView/Cells/OWSContactOffersCell.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSContactShareButtonsView.h b/Session/Signal/ConversationView/Cells/OWSContactShareButtonsView.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSContactShareButtonsView.h rename to Session/Signal/ConversationView/Cells/OWSContactShareButtonsView.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSContactShareButtonsView.m b/Session/Signal/ConversationView/Cells/OWSContactShareButtonsView.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSContactShareButtonsView.m rename to Session/Signal/ConversationView/Cells/OWSContactShareButtonsView.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSContactShareView.h b/Session/Signal/ConversationView/Cells/OWSContactShareView.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSContactShareView.h rename to Session/Signal/ConversationView/Cells/OWSContactShareView.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSContactShareView.m b/Session/Signal/ConversationView/Cells/OWSContactShareView.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSContactShareView.m rename to Session/Signal/ConversationView/Cells/OWSContactShareView.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSGenericAttachmentView.h b/Session/Signal/ConversationView/Cells/OWSGenericAttachmentView.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSGenericAttachmentView.h rename to Session/Signal/ConversationView/Cells/OWSGenericAttachmentView.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSGenericAttachmentView.m b/Session/Signal/ConversationView/Cells/OWSGenericAttachmentView.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSGenericAttachmentView.m rename to Session/Signal/ConversationView/Cells/OWSGenericAttachmentView.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSLabel.h b/Session/Signal/ConversationView/Cells/OWSLabel.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSLabel.h rename to Session/Signal/ConversationView/Cells/OWSLabel.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSLabel.m b/Session/Signal/ConversationView/Cells/OWSLabel.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSLabel.m rename to Session/Signal/ConversationView/Cells/OWSLabel.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSMessageBubbleView.h b/Session/Signal/ConversationView/Cells/OWSMessageBubbleView.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSMessageBubbleView.h rename to Session/Signal/ConversationView/Cells/OWSMessageBubbleView.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSMessageBubbleView.m b/Session/Signal/ConversationView/Cells/OWSMessageBubbleView.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSMessageBubbleView.m rename to Session/Signal/ConversationView/Cells/OWSMessageBubbleView.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSMessageCell.h b/Session/Signal/ConversationView/Cells/OWSMessageCell.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSMessageCell.h rename to Session/Signal/ConversationView/Cells/OWSMessageCell.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m b/Session/Signal/ConversationView/Cells/OWSMessageCell.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m rename to Session/Signal/ConversationView/Cells/OWSMessageCell.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSMessageFooterView.h b/Session/Signal/ConversationView/Cells/OWSMessageFooterView.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSMessageFooterView.h rename to Session/Signal/ConversationView/Cells/OWSMessageFooterView.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSMessageFooterView.m b/Session/Signal/ConversationView/Cells/OWSMessageFooterView.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSMessageFooterView.m rename to Session/Signal/ConversationView/Cells/OWSMessageFooterView.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSMessageHeaderView.h b/Session/Signal/ConversationView/Cells/OWSMessageHeaderView.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSMessageHeaderView.h rename to Session/Signal/ConversationView/Cells/OWSMessageHeaderView.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSMessageHeaderView.m b/Session/Signal/ConversationView/Cells/OWSMessageHeaderView.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSMessageHeaderView.m rename to Session/Signal/ConversationView/Cells/OWSMessageHeaderView.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSMessageTextView.h b/Session/Signal/ConversationView/Cells/OWSMessageTextView.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSMessageTextView.h rename to Session/Signal/ConversationView/Cells/OWSMessageTextView.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSMessageTextView.m b/Session/Signal/ConversationView/Cells/OWSMessageTextView.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSMessageTextView.m rename to Session/Signal/ConversationView/Cells/OWSMessageTextView.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSMessageTimerView.h b/Session/Signal/ConversationView/Cells/OWSMessageTimerView.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSMessageTimerView.h rename to Session/Signal/ConversationView/Cells/OWSMessageTimerView.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSMessageTimerView.m b/Session/Signal/ConversationView/Cells/OWSMessageTimerView.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSMessageTimerView.m rename to Session/Signal/ConversationView/Cells/OWSMessageTimerView.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSQuotedMessageView.h b/Session/Signal/ConversationView/Cells/OWSQuotedMessageView.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSQuotedMessageView.h rename to Session/Signal/ConversationView/Cells/OWSQuotedMessageView.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSQuotedMessageView.m b/Session/Signal/ConversationView/Cells/OWSQuotedMessageView.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSQuotedMessageView.m rename to Session/Signal/ConversationView/Cells/OWSQuotedMessageView.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSSystemMessageCell.h b/Session/Signal/ConversationView/Cells/OWSSystemMessageCell.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSSystemMessageCell.h rename to Session/Signal/ConversationView/Cells/OWSSystemMessageCell.h diff --git a/Session/src/ViewControllers/ConversationView/Cells/OWSSystemMessageCell.m b/Session/Signal/ConversationView/Cells/OWSSystemMessageCell.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/OWSSystemMessageCell.m rename to Session/Signal/ConversationView/Cells/OWSSystemMessageCell.m diff --git a/Session/src/ViewControllers/ConversationView/Cells/TypingIndicatorCell.swift b/Session/Signal/ConversationView/Cells/TypingIndicatorCell.swift similarity index 100% rename from Session/src/ViewControllers/ConversationView/Cells/TypingIndicatorCell.swift rename to Session/Signal/ConversationView/Cells/TypingIndicatorCell.swift diff --git a/Session/src/ViewControllers/ConversationView/ConversationCollectionView.h b/Session/Signal/ConversationView/ConversationCollectionView.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationCollectionView.h rename to Session/Signal/ConversationView/ConversationCollectionView.h diff --git a/Session/src/ViewControllers/ConversationView/ConversationCollectionView.m b/Session/Signal/ConversationView/ConversationCollectionView.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationCollectionView.m rename to Session/Signal/ConversationView/ConversationCollectionView.m diff --git a/Session/src/ViewControllers/ConversationView/ConversationHeaderView.swift b/Session/Signal/ConversationView/ConversationHeaderView.swift similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationHeaderView.swift rename to Session/Signal/ConversationView/ConversationHeaderView.swift diff --git a/Session/src/ViewControllers/ConversationView/ConversationInputTextView.h b/Session/Signal/ConversationView/ConversationInputTextView.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationInputTextView.h rename to Session/Signal/ConversationView/ConversationInputTextView.h diff --git a/Session/src/ViewControllers/ConversationView/ConversationInputTextView.m b/Session/Signal/ConversationView/ConversationInputTextView.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationInputTextView.m rename to Session/Signal/ConversationView/ConversationInputTextView.m diff --git a/Session/src/ViewControllers/ConversationView/ConversationInputToolbar.h b/Session/Signal/ConversationView/ConversationInputToolbar.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationInputToolbar.h rename to Session/Signal/ConversationView/ConversationInputToolbar.h diff --git a/Session/src/ViewControllers/ConversationView/ConversationInputToolbar.m b/Session/Signal/ConversationView/ConversationInputToolbar.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationInputToolbar.m rename to Session/Signal/ConversationView/ConversationInputToolbar.m diff --git a/Session/src/ViewControllers/ConversationView/ConversationMessageMapping.swift b/Session/Signal/ConversationView/ConversationMessageMapping.swift similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationMessageMapping.swift rename to Session/Signal/ConversationView/ConversationMessageMapping.swift diff --git a/Session/src/ViewControllers/ConversationView/ConversationScrollButton.h b/Session/Signal/ConversationView/ConversationScrollButton.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationScrollButton.h rename to Session/Signal/ConversationView/ConversationScrollButton.h diff --git a/Session/src/ViewControllers/ConversationView/ConversationScrollButton.m b/Session/Signal/ConversationView/ConversationScrollButton.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationScrollButton.m rename to Session/Signal/ConversationView/ConversationScrollButton.m diff --git a/Session/src/ViewControllers/ConversationView/ConversationViewController.h b/Session/Signal/ConversationView/ConversationViewController.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationViewController.h rename to Session/Signal/ConversationView/ConversationViewController.h diff --git a/Session/src/ViewControllers/ConversationView/ConversationViewController.m b/Session/Signal/ConversationView/ConversationViewController.m similarity index 99% rename from Session/src/ViewControllers/ConversationView/ConversationViewController.m rename to Session/Signal/ConversationView/ConversationViewController.m index 43a93572b..4479d1eca 100644 --- a/Session/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Session/Signal/ConversationView/ConversationViewController.m @@ -16,7 +16,6 @@ #import "ConversationViewLayout.h" #import "ConversationViewModel.h" #import "DateUtil.h" -#import "DebugUITableViewController.h" #import "FingerprintViewController.h" #import #import "OWSAudioPlayer.h" diff --git a/Session/src/ViewControllers/ConversationView/ConversationViewItem.h b/Session/Signal/ConversationView/ConversationViewItem.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationViewItem.h rename to Session/Signal/ConversationView/ConversationViewItem.h diff --git a/Session/src/ViewControllers/ConversationView/ConversationViewItem.m b/Session/Signal/ConversationView/ConversationViewItem.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationViewItem.m rename to Session/Signal/ConversationView/ConversationViewItem.m diff --git a/Session/src/ViewControllers/ConversationView/ConversationViewLayout.h b/Session/Signal/ConversationView/ConversationViewLayout.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationViewLayout.h rename to Session/Signal/ConversationView/ConversationViewLayout.h diff --git a/Session/src/ViewControllers/ConversationView/ConversationViewLayout.m b/Session/Signal/ConversationView/ConversationViewLayout.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationViewLayout.m rename to Session/Signal/ConversationView/ConversationViewLayout.m diff --git a/Session/src/ViewControllers/ConversationView/ConversationViewModel.h b/Session/Signal/ConversationView/ConversationViewModel.h similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationViewModel.h rename to Session/Signal/ConversationView/ConversationViewModel.h diff --git a/Session/src/ViewControllers/ConversationView/ConversationViewModel.m b/Session/Signal/ConversationView/ConversationViewModel.m similarity index 100% rename from Session/src/ViewControllers/ConversationView/ConversationViewModel.m rename to Session/Signal/ConversationView/ConversationViewModel.m diff --git a/Session/src/ViewControllers/ConversationView/TypingIndicatorInteraction.swift b/Session/Signal/ConversationView/TypingIndicatorInteraction.swift similarity index 100% rename from Session/src/ViewControllers/ConversationView/TypingIndicatorInteraction.swift rename to Session/Signal/ConversationView/TypingIndicatorInteraction.swift diff --git a/Session/src/ViewControllers/CropScaleImageViewController.swift b/Session/Signal/CropScaleImageViewController.swift similarity index 100% rename from Session/src/ViewControllers/CropScaleImageViewController.swift rename to Session/Signal/CropScaleImageViewController.swift diff --git a/Session/src/util/DateUtil.h b/Session/Signal/DateUtil.h similarity index 100% rename from Session/src/util/DateUtil.h rename to Session/Signal/DateUtil.h diff --git a/Session/src/util/DateUtil.m b/Session/Signal/DateUtil.m similarity index 100% rename from Session/src/util/DateUtil.m rename to Session/Signal/DateUtil.m diff --git a/Session/src/views/DismissableTextField.swift b/Session/Signal/DismissableTextField.swift similarity index 100% rename from Session/src/views/DismissableTextField.swift rename to Session/Signal/DismissableTextField.swift diff --git a/Session/src/ViewControllers/AppSettings/DomainFrontingCountryViewController.h b/Session/Signal/DomainFrontingCountryViewController.h similarity index 100% rename from Session/src/ViewControllers/AppSettings/DomainFrontingCountryViewController.h rename to Session/Signal/DomainFrontingCountryViewController.h diff --git a/Session/src/ViewControllers/AppSettings/DomainFrontingCountryViewController.m b/Session/Signal/DomainFrontingCountryViewController.m similarity index 100% rename from Session/src/ViewControllers/AppSettings/DomainFrontingCountryViewController.m rename to Session/Signal/DomainFrontingCountryViewController.m diff --git a/Session/src/environment/ExperienceUpgrades/ExperienceUpgrade.swift b/Session/Signal/ExperienceUpgrade.swift similarity index 100% rename from Session/src/environment/ExperienceUpgrades/ExperienceUpgrade.swift rename to Session/Signal/ExperienceUpgrade.swift diff --git a/Session/src/environment/ExperienceUpgrades/ExperienceUpgradeFinder.swift b/Session/Signal/ExperienceUpgradeFinder.swift similarity index 100% rename from Session/src/environment/ExperienceUpgrades/ExperienceUpgradeFinder.swift rename to Session/Signal/ExperienceUpgradeFinder.swift diff --git a/Session/src/ViewControllers/ThreadSettings/FingerprintViewController.h b/Session/Signal/FingerprintViewController.h similarity index 100% rename from Session/src/ViewControllers/ThreadSettings/FingerprintViewController.h rename to Session/Signal/FingerprintViewController.h diff --git a/Session/src/ViewControllers/ThreadSettings/FingerprintViewController.m b/Session/Signal/FingerprintViewController.m similarity index 100% rename from Session/src/ViewControllers/ThreadSettings/FingerprintViewController.m rename to Session/Signal/FingerprintViewController.m diff --git a/Session/src/ViewControllers/ThreadSettings/FingerprintViewScanController.h b/Session/Signal/FingerprintViewScanController.h similarity index 100% rename from Session/src/ViewControllers/ThreadSettings/FingerprintViewScanController.h rename to Session/Signal/FingerprintViewScanController.h diff --git a/Session/src/ViewControllers/ThreadSettings/FingerprintViewScanController.m b/Session/Signal/FingerprintViewScanController.m similarity index 100% rename from Session/src/ViewControllers/ThreadSettings/FingerprintViewScanController.m rename to Session/Signal/FingerprintViewScanController.m diff --git a/Session/src/ViewControllers/GifPicker/GifPickerCell.swift b/Session/Signal/GifPickerCell.swift similarity index 100% rename from Session/src/ViewControllers/GifPicker/GifPickerCell.swift rename to Session/Signal/GifPickerCell.swift diff --git a/Session/src/ViewControllers/GifPicker/GifPickerLayout.swift b/Session/Signal/GifPickerLayout.swift similarity index 100% rename from Session/src/ViewControllers/GifPicker/GifPickerLayout.swift rename to Session/Signal/GifPickerLayout.swift diff --git a/Session/src/ViewControllers/GifPicker/GifPickerViewController.swift b/Session/Signal/GifPickerViewController.swift similarity index 100% rename from Session/src/ViewControllers/GifPicker/GifPickerViewController.swift rename to Session/Signal/GifPickerViewController.swift diff --git a/Session/src/network/GiphyAPI.swift b/Session/Signal/GiphyAPI.swift similarity index 100% rename from Session/src/network/GiphyAPI.swift rename to Session/Signal/GiphyAPI.swift diff --git a/Session/src/network/GiphyDownloader.swift b/Session/Signal/GiphyDownloader.swift similarity index 100% rename from Session/src/network/GiphyDownloader.swift rename to Session/Signal/GiphyDownloader.swift diff --git a/Session/src/views/GroupTableViewCell.swift b/Session/Signal/GroupTableViewCell.swift similarity index 100% rename from Session/src/views/GroupTableViewCell.swift rename to Session/Signal/GroupTableViewCell.swift diff --git a/Session/src/UserInterface/HapticFeedback.swift b/Session/Signal/HapticFeedback.swift similarity index 100% rename from Session/src/UserInterface/HapticFeedback.swift rename to Session/Signal/HapticFeedback.swift diff --git a/Session/src/ViewControllers/Photos/ImagePickerController.swift b/Session/Signal/ImagePickerController.swift similarity index 100% rename from Session/src/ViewControllers/Photos/ImagePickerController.swift rename to Session/Signal/ImagePickerController.swift diff --git a/Session/src/ViewControllers/InviteFlow.swift b/Session/Signal/InviteFlow.swift similarity index 100% rename from Session/src/ViewControllers/InviteFlow.swift rename to Session/Signal/InviteFlow.swift diff --git a/Session/src/util/Launch Screen.storyboard b/Session/Signal/Launch Screen.storyboard similarity index 100% rename from Session/src/util/Launch Screen.storyboard rename to Session/Signal/Launch Screen.storyboard diff --git a/Session/src/UserInterface/Notifications/LegacyNotificationsAdaptee.swift b/Session/Signal/LegacyNotificationsAdaptee.swift similarity index 100% rename from Session/src/UserInterface/Notifications/LegacyNotificationsAdaptee.swift rename to Session/Signal/LegacyNotificationsAdaptee.swift diff --git a/Session/src/views/LinkPreviewView.swift b/Session/Signal/LinkPreviewView.swift similarity index 100% rename from Session/src/views/LinkPreviewView.swift rename to Session/Signal/LinkPreviewView.swift diff --git a/Session/src/ViewControllers/LoadingViewController.swift b/Session/Signal/LoadingViewController.swift similarity index 100% rename from Session/src/ViewControllers/LoadingViewController.swift rename to Session/Signal/LoadingViewController.swift diff --git a/Session/src/ViewControllers/LongTextViewController.swift b/Session/Signal/LongTextViewController.swift similarity index 100% rename from Session/src/ViewControllers/LongTextViewController.swift rename to Session/Signal/LongTextViewController.swift diff --git a/Session/src/Storyboard/Main.storyboard b/Session/Signal/Main.storyboard similarity index 100% rename from Session/src/Storyboard/Main.storyboard rename to Session/Signal/Main.storyboard diff --git a/Session/src/util/MainAppContext.h b/Session/Signal/MainAppContext.h similarity index 100% rename from Session/src/util/MainAppContext.h rename to Session/Signal/MainAppContext.h diff --git a/Session/src/util/MainAppContext.m b/Session/Signal/MainAppContext.m similarity index 100% rename from Session/src/util/MainAppContext.m rename to Session/Signal/MainAppContext.m diff --git a/Session/src/views/MarqueeLabel.swift b/Session/Signal/MarqueeLabel.swift similarity index 100% rename from Session/src/views/MarqueeLabel.swift rename to Session/Signal/MarqueeLabel.swift diff --git a/Session/src/ViewControllers/MediaDetailViewController.h b/Session/Signal/MediaDetailViewController.h similarity index 100% rename from Session/src/ViewControllers/MediaDetailViewController.h rename to Session/Signal/MediaDetailViewController.h diff --git a/Session/src/ViewControllers/MediaDetailViewController.m b/Session/Signal/MediaDetailViewController.m similarity index 100% rename from Session/src/ViewControllers/MediaDetailViewController.m rename to Session/Signal/MediaDetailViewController.m diff --git a/Session/src/ViewControllers/MediaGalleryViewController.swift b/Session/Signal/MediaGalleryViewController.swift similarity index 100% rename from Session/src/ViewControllers/MediaGalleryViewController.swift rename to Session/Signal/MediaGalleryViewController.swift diff --git a/Session/src/ViewControllers/MediaPageViewController.swift b/Session/Signal/MediaPageViewController.swift similarity index 100% rename from Session/src/ViewControllers/MediaPageViewController.swift rename to Session/Signal/MediaPageViewController.swift diff --git a/Session/src/ViewControllers/MediaTileViewController.swift b/Session/Signal/MediaTileViewController.swift similarity index 100% rename from Session/src/ViewControllers/MediaTileViewController.swift rename to Session/Signal/MediaTileViewController.swift diff --git a/Session/src/ViewControllers/MenuActionsViewController.swift b/Session/Signal/MenuActionsViewController.swift similarity index 100% rename from Session/src/ViewControllers/MenuActionsViewController.swift rename to Session/Signal/MenuActionsViewController.swift diff --git a/Session/src/Models/MessageActions.swift b/Session/Signal/MessageActions.swift similarity index 100% rename from Session/src/Models/MessageActions.swift rename to Session/Signal/MessageActions.swift diff --git a/Session/src/ViewControllers/MessageDetailViewController.swift b/Session/Signal/MessageDetailViewController.swift similarity index 100% rename from Session/src/ViewControllers/MessageDetailViewController.swift rename to Session/Signal/MessageDetailViewController.swift diff --git a/Session/src/Jobs/MessageFetcherJob.swift b/Session/Signal/MessageFetcherJob.swift similarity index 100% rename from Session/src/Jobs/MessageFetcherJob.swift rename to Session/Signal/MessageFetcherJob.swift diff --git a/Session/src/ViewControllers/Utils/MessageRecipientStatusUtils.swift b/Session/Signal/MessageRecipientStatusUtils.swift similarity index 100% rename from Session/src/ViewControllers/Utils/MessageRecipientStatusUtils.swift rename to Session/Signal/MessageRecipientStatusUtils.swift diff --git a/Session/src/views/NeverClearView.swift b/Session/Signal/NeverClearView.swift similarity index 100% rename from Session/src/views/NeverClearView.swift rename to Session/Signal/NeverClearView.swift diff --git a/Session/src/call/NonCallKitCallUIAdaptee.swift b/Session/Signal/NonCallKitCallUIAdaptee.swift similarity index 100% rename from Session/src/call/NonCallKitCallUIAdaptee.swift rename to Session/Signal/NonCallKitCallUIAdaptee.swift diff --git a/Session/src/ViewControllers/AppSettings/NotificationSettingsOptionsViewController.h b/Session/Signal/NotificationSettingsOptionsViewController.h similarity index 100% rename from Session/src/ViewControllers/AppSettings/NotificationSettingsOptionsViewController.h rename to Session/Signal/NotificationSettingsOptionsViewController.h diff --git a/Session/src/ViewControllers/AppSettings/NotificationSettingsOptionsViewController.m b/Session/Signal/NotificationSettingsOptionsViewController.m similarity index 100% rename from Session/src/ViewControllers/AppSettings/NotificationSettingsOptionsViewController.m rename to Session/Signal/NotificationSettingsOptionsViewController.m diff --git a/Session/src/ViewControllers/AppSettings/NotificationSettingsViewController.h b/Session/Signal/NotificationSettingsViewController.h similarity index 100% rename from Session/src/ViewControllers/AppSettings/NotificationSettingsViewController.h rename to Session/Signal/NotificationSettingsViewController.h diff --git a/Session/src/ViewControllers/AppSettings/NotificationSettingsViewController.m b/Session/Signal/NotificationSettingsViewController.m similarity index 100% rename from Session/src/ViewControllers/AppSettings/NotificationSettingsViewController.m rename to Session/Signal/NotificationSettingsViewController.m diff --git a/Session/src/ViewControllers/ThreadSettings/OWSAddToContactViewController.h b/Session/Signal/OWSAddToContactViewController.h similarity index 100% rename from Session/src/ViewControllers/ThreadSettings/OWSAddToContactViewController.h rename to Session/Signal/OWSAddToContactViewController.h diff --git a/Session/src/ViewControllers/ThreadSettings/OWSAddToContactViewController.m b/Session/Signal/OWSAddToContactViewController.m similarity index 100% rename from Session/src/ViewControllers/ThreadSettings/OWSAddToContactViewController.m rename to Session/Signal/OWSAddToContactViewController.m diff --git a/Session/src/util/OWSAnalytics.swift b/Session/Signal/OWSAnalytics.swift similarity index 100% rename from Session/src/util/OWSAnalytics.swift rename to Session/Signal/OWSAnalytics.swift diff --git a/Session/src/util/Backup/OWSBackup.h b/Session/Signal/OWSBackup.h similarity index 100% rename from Session/src/util/Backup/OWSBackup.h rename to Session/Signal/OWSBackup.h diff --git a/Session/src/util/Backup/OWSBackup.m b/Session/Signal/OWSBackup.m similarity index 100% rename from Session/src/util/Backup/OWSBackup.m rename to Session/Signal/OWSBackup.m diff --git a/Session/src/util/Backup/OWSBackupAPI.swift b/Session/Signal/OWSBackupAPI.swift similarity index 100% rename from Session/src/util/Backup/OWSBackupAPI.swift rename to Session/Signal/OWSBackupAPI.swift diff --git a/Session/src/util/Backup/OWSBackupExportJob.h b/Session/Signal/OWSBackupExportJob.h similarity index 100% rename from Session/src/util/Backup/OWSBackupExportJob.h rename to Session/Signal/OWSBackupExportJob.h diff --git a/Session/src/util/Backup/OWSBackupExportJob.m b/Session/Signal/OWSBackupExportJob.m similarity index 100% rename from Session/src/util/Backup/OWSBackupExportJob.m rename to Session/Signal/OWSBackupExportJob.m diff --git a/Session/src/util/Backup/OWSBackupIO.h b/Session/Signal/OWSBackupIO.h similarity index 100% rename from Session/src/util/Backup/OWSBackupIO.h rename to Session/Signal/OWSBackupIO.h diff --git a/Session/src/util/Backup/OWSBackupIO.m b/Session/Signal/OWSBackupIO.m similarity index 100% rename from Session/src/util/Backup/OWSBackupIO.m rename to Session/Signal/OWSBackupIO.m diff --git a/Session/src/util/Backup/OWSBackupImportJob.h b/Session/Signal/OWSBackupImportJob.h similarity index 100% rename from Session/src/util/Backup/OWSBackupImportJob.h rename to Session/Signal/OWSBackupImportJob.h diff --git a/Session/src/util/Backup/OWSBackupImportJob.m b/Session/Signal/OWSBackupImportJob.m similarity index 100% rename from Session/src/util/Backup/OWSBackupImportJob.m rename to Session/Signal/OWSBackupImportJob.m diff --git a/Session/src/util/Backup/OWSBackupJob.h b/Session/Signal/OWSBackupJob.h similarity index 100% rename from Session/src/util/Backup/OWSBackupJob.h rename to Session/Signal/OWSBackupJob.h diff --git a/Session/src/util/Backup/OWSBackupJob.m b/Session/Signal/OWSBackupJob.m similarity index 100% rename from Session/src/util/Backup/OWSBackupJob.m rename to Session/Signal/OWSBackupJob.m diff --git a/Session/src/util/Backup/OWSBackupLazyRestore.swift b/Session/Signal/OWSBackupLazyRestore.swift similarity index 100% rename from Session/src/util/Backup/OWSBackupLazyRestore.swift rename to Session/Signal/OWSBackupLazyRestore.swift diff --git a/Session/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.h b/Session/Signal/OWSBackupSettingsViewController.h similarity index 100% rename from Session/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.h rename to Session/Signal/OWSBackupSettingsViewController.h diff --git a/Session/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.m b/Session/Signal/OWSBackupSettingsViewController.m similarity index 100% rename from Session/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.m rename to Session/Signal/OWSBackupSettingsViewController.m diff --git a/Session/src/views/OWSBezierPathView.h b/Session/Signal/OWSBezierPathView.h similarity index 100% rename from Session/src/views/OWSBezierPathView.h rename to Session/Signal/OWSBezierPathView.h diff --git a/Session/src/views/OWSBezierPathView.m b/Session/Signal/OWSBezierPathView.m similarity index 100% rename from Session/src/views/OWSBezierPathView.m rename to Session/Signal/OWSBezierPathView.m diff --git a/Session/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.h b/Session/Signal/OWSConversationSettingsViewController.h similarity index 100% rename from Session/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.h rename to Session/Signal/OWSConversationSettingsViewController.h diff --git a/Session/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m b/Session/Signal/OWSConversationSettingsViewController.m similarity index 100% rename from Session/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m rename to Session/Signal/OWSConversationSettingsViewController.m diff --git a/Session/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewDelegate.h b/Session/Signal/OWSConversationSettingsViewDelegate.h similarity index 100% rename from Session/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewDelegate.h rename to Session/Signal/OWSConversationSettingsViewDelegate.h diff --git a/Session/src/Models/OWSDeviceProvisioningURLParser.h b/Session/Signal/OWSDeviceProvisioningURLParser.h similarity index 100% rename from Session/src/Models/OWSDeviceProvisioningURLParser.h rename to Session/Signal/OWSDeviceProvisioningURLParser.h diff --git a/Session/src/Models/OWSDeviceProvisioningURLParser.m b/Session/Signal/OWSDeviceProvisioningURLParser.m similarity index 100% rename from Session/src/Models/OWSDeviceProvisioningURLParser.m rename to Session/Signal/OWSDeviceProvisioningURLParser.m diff --git a/Session/src/views/OWSDeviceTableViewCell.h b/Session/Signal/OWSDeviceTableViewCell.h similarity index 100% rename from Session/src/views/OWSDeviceTableViewCell.h rename to Session/Signal/OWSDeviceTableViewCell.h diff --git a/Session/src/views/OWSDeviceTableViewCell.m b/Session/Signal/OWSDeviceTableViewCell.m similarity index 100% rename from Session/src/views/OWSDeviceTableViewCell.m rename to Session/Signal/OWSDeviceTableViewCell.m diff --git a/Session/src/ViewControllers/OWSImagePickerController.swift b/Session/Signal/OWSImagePickerController.swift similarity index 100% rename from Session/src/ViewControllers/OWSImagePickerController.swift rename to Session/Signal/OWSImagePickerController.swift diff --git a/Session/src/util/OWSOrphanDataCleaner.h b/Session/Signal/OWSOrphanDataCleaner.h similarity index 100% rename from Session/src/util/OWSOrphanDataCleaner.h rename to Session/Signal/OWSOrphanDataCleaner.h diff --git a/Session/src/util/OWSOrphanDataCleaner.m b/Session/Signal/OWSOrphanDataCleaner.m similarity index 100% rename from Session/src/util/OWSOrphanDataCleaner.m rename to Session/Signal/OWSOrphanDataCleaner.m diff --git a/Session/src/views/OWSProgressView.h b/Session/Signal/OWSProgressView.h similarity index 100% rename from Session/src/views/OWSProgressView.h rename to Session/Signal/OWSProgressView.h diff --git a/Session/src/views/OWSProgressView.m b/Session/Signal/OWSProgressView.m similarity index 100% rename from Session/src/views/OWSProgressView.m rename to Session/Signal/OWSProgressView.m diff --git a/Session/src/ViewControllers/AppSettings/OWSQRCodeScanningViewController.h b/Session/Signal/OWSQRCodeScanningViewController.h similarity index 100% rename from Session/src/ViewControllers/AppSettings/OWSQRCodeScanningViewController.h rename to Session/Signal/OWSQRCodeScanningViewController.h diff --git a/Session/src/ViewControllers/AppSettings/OWSQRCodeScanningViewController.m b/Session/Signal/OWSQRCodeScanningViewController.m similarity index 100% rename from Session/src/ViewControllers/AppSettings/OWSQRCodeScanningViewController.m rename to Session/Signal/OWSQRCodeScanningViewController.m diff --git a/Session/src/util/OWSScreenLockUI.h b/Session/Signal/OWSScreenLockUI.h similarity index 100% rename from Session/src/util/OWSScreenLockUI.h rename to Session/Signal/OWSScreenLockUI.h diff --git a/Session/src/util/OWSScreenLockUI.m b/Session/Signal/OWSScreenLockUI.m similarity index 100% rename from Session/src/util/OWSScreenLockUI.m rename to Session/Signal/OWSScreenLockUI.m diff --git a/Session/src/Jobs/OWSSessionResetJobRecord.h b/Session/Signal/OWSSessionResetJobRecord.h similarity index 100% rename from Session/src/Jobs/OWSSessionResetJobRecord.h rename to Session/Signal/OWSSessionResetJobRecord.h diff --git a/Session/src/Jobs/OWSSessionResetJobRecord.m b/Session/Signal/OWSSessionResetJobRecord.m similarity index 100% rename from Session/src/Jobs/OWSSessionResetJobRecord.m rename to Session/Signal/OWSSessionResetJobRecord.m diff --git a/Session/src/ViewControllers/AppSettings/OWSSoundSettingsViewController.h b/Session/Signal/OWSSoundSettingsViewController.h similarity index 100% rename from Session/src/ViewControllers/AppSettings/OWSSoundSettingsViewController.h rename to Session/Signal/OWSSoundSettingsViewController.h diff --git a/Session/src/ViewControllers/AppSettings/OWSSoundSettingsViewController.m b/Session/Signal/OWSSoundSettingsViewController.m similarity index 100% rename from Session/src/ViewControllers/AppSettings/OWSSoundSettingsViewController.m rename to Session/Signal/OWSSoundSettingsViewController.m diff --git a/Session/src/Generated/OWSWebRTCDataProtos.pb.swift b/Session/Signal/OWSWebRTCDataProtos.pb.swift similarity index 100% rename from Session/src/Generated/OWSWebRTCDataProtos.pb.swift rename to Session/Signal/OWSWebRTCDataProtos.pb.swift diff --git a/Session/src/ViewControllers/Registration/OnboardingCaptchaViewController.swift b/Session/Signal/OnboardingCaptchaViewController.swift similarity index 100% rename from Session/src/ViewControllers/Registration/OnboardingCaptchaViewController.swift rename to Session/Signal/OnboardingCaptchaViewController.swift diff --git a/Session/src/call/OutboundCallInitiator.swift b/Session/Signal/OutboundCallInitiator.swift similarity index 100% rename from Session/src/call/OutboundCallInitiator.swift rename to Session/Signal/OutboundCallInitiator.swift diff --git a/Session/src/util/Pastelog.h b/Session/Signal/Pastelog.h similarity index 100% rename from Session/src/util/Pastelog.h rename to Session/Signal/Pastelog.h diff --git a/Session/src/util/Pastelog.m b/Session/Signal/Pastelog.m similarity index 100% rename from Session/src/util/Pastelog.m rename to Session/Signal/Pastelog.m diff --git a/Session/src/call/PeerConnectionClient.swift b/Session/Signal/PeerConnectionClient.swift similarity index 100% rename from Session/src/call/PeerConnectionClient.swift rename to Session/Signal/PeerConnectionClient.swift diff --git a/Session/src/ViewControllers/Photos/PhotoCapture.swift b/Session/Signal/PhotoCapture.swift similarity index 100% rename from Session/src/ViewControllers/Photos/PhotoCapture.swift rename to Session/Signal/PhotoCapture.swift diff --git a/Session/src/ViewControllers/Photos/PhotoCaptureViewController.swift b/Session/Signal/PhotoCaptureViewController.swift similarity index 100% rename from Session/src/ViewControllers/Photos/PhotoCaptureViewController.swift rename to Session/Signal/PhotoCaptureViewController.swift diff --git a/Session/src/ViewControllers/Photos/PhotoCollectionPickerController.swift b/Session/Signal/PhotoCollectionPickerController.swift similarity index 100% rename from Session/src/ViewControllers/Photos/PhotoCollectionPickerController.swift rename to Session/Signal/PhotoCollectionPickerController.swift diff --git a/Session/src/views/PhotoGridViewCell.swift b/Session/Signal/PhotoGridViewCell.swift similarity index 100% rename from Session/src/views/PhotoGridViewCell.swift rename to Session/Signal/PhotoGridViewCell.swift diff --git a/Session/src/ViewControllers/Photos/PhotoLibrary.swift b/Session/Signal/PhotoLibrary.swift similarity index 100% rename from Session/src/ViewControllers/Photos/PhotoLibrary.swift rename to Session/Signal/PhotoLibrary.swift diff --git a/Session/src/views/PinEntryView.h b/Session/Signal/PinEntryView.h similarity index 100% rename from Session/src/views/PinEntryView.h rename to Session/Signal/PinEntryView.h diff --git a/Session/src/views/PinEntryView.m b/Session/Signal/PinEntryView.m similarity index 100% rename from Session/src/views/PinEntryView.m rename to Session/Signal/PinEntryView.m diff --git a/Session/src/util/Platform.swift b/Session/Signal/Platform.swift similarity index 100% rename from Session/src/util/Platform.swift rename to Session/Signal/Platform.swift diff --git a/Session/src/ViewControllers/AppSettings/PrivacySettingsTableViewController.h b/Session/Signal/PrivacySettingsTableViewController.h similarity index 100% rename from Session/src/ViewControllers/AppSettings/PrivacySettingsTableViewController.h rename to Session/Signal/PrivacySettingsTableViewController.h diff --git a/Session/src/ViewControllers/AppSettings/PrivacySettingsTableViewController.m b/Session/Signal/PrivacySettingsTableViewController.m similarity index 100% rename from Session/src/ViewControllers/AppSettings/PrivacySettingsTableViewController.m rename to Session/Signal/PrivacySettingsTableViewController.m diff --git a/Session/src/environment/PushRegistrationManager.swift b/Session/Signal/PushRegistrationManager.swift similarity index 100% rename from Session/src/environment/PushRegistrationManager.swift rename to Session/Signal/PushRegistrationManager.swift diff --git a/Session/src/views/QuotedReplyPreview.swift b/Session/Signal/QuotedReplyPreview.swift similarity index 100% rename from Session/src/views/QuotedReplyPreview.swift rename to Session/Signal/QuotedReplyPreview.swift diff --git a/Session/src/views/ReminderView.swift b/Session/Signal/ReminderView.swift similarity index 100% rename from Session/src/views/ReminderView.swift rename to Session/Signal/ReminderView.swift diff --git a/Session/src/views/RemoteVideoView.h b/Session/Signal/RemoteVideoView.h similarity index 100% rename from Session/src/views/RemoteVideoView.h rename to Session/Signal/RemoteVideoView.h diff --git a/Session/src/views/RemoteVideoView.m b/Session/Signal/RemoteVideoView.m similarity index 100% rename from Session/src/views/RemoteVideoView.m rename to Session/Signal/RemoteVideoView.m diff --git a/Session/src/ViewControllers/SafetyNumberConfirmationAlert.swift b/Session/Signal/SafetyNumberConfirmationAlert.swift similarity index 100% rename from Session/src/ViewControllers/SafetyNumberConfirmationAlert.swift rename to Session/Signal/SafetyNumberConfirmationAlert.swift diff --git a/Session/src/ViewControllers/Photos/SendMediaNavigationController.swift b/Session/Signal/SendMediaNavigationController.swift similarity index 100% rename from Session/src/ViewControllers/Photos/SendMediaNavigationController.swift rename to Session/Signal/SendMediaNavigationController.swift diff --git a/Session/src/Jobs/SessionResetJob.swift b/Session/Signal/SessionResetJob.swift similarity index 100% rename from Session/src/Jobs/SessionResetJob.swift rename to Session/Signal/SessionResetJob.swift diff --git a/Session/src/ViewControllers/ThreadSettings/ShowGroupMembersViewController.h b/Session/Signal/ShowGroupMembersViewController.h similarity index 100% rename from Session/src/ViewControllers/ThreadSettings/ShowGroupMembersViewController.h rename to Session/Signal/ShowGroupMembersViewController.h diff --git a/Session/src/ViewControllers/ThreadSettings/ShowGroupMembersViewController.m b/Session/Signal/ShowGroupMembersViewController.m similarity index 100% rename from Session/src/ViewControllers/ThreadSettings/ShowGroupMembersViewController.m rename to Session/Signal/ShowGroupMembersViewController.m diff --git a/Session/src/environment/SignalApp.h b/Session/Signal/SignalApp.h similarity index 100% rename from Session/src/environment/SignalApp.h rename to Session/Signal/SignalApp.h diff --git a/Session/src/environment/SignalApp.m b/Session/Signal/SignalApp.m similarity index 100% rename from Session/src/environment/SignalApp.m rename to Session/Signal/SignalApp.m diff --git a/Session/src/call/SignalCall.swift b/Session/Signal/SignalCall.swift similarity index 100% rename from Session/src/call/SignalCall.swift rename to Session/Signal/SignalCall.swift diff --git a/Session/src/ViewControllers/SignalsNavigationController.h b/Session/Signal/SignalsNavigationController.h similarity index 100% rename from Session/src/ViewControllers/SignalsNavigationController.h rename to Session/Signal/SignalsNavigationController.h diff --git a/Session/src/ViewControllers/SignalsNavigationController.m b/Session/Signal/SignalsNavigationController.m similarity index 100% rename from Session/src/ViewControllers/SignalsNavigationController.m rename to Session/Signal/SignalsNavigationController.m diff --git a/Session/src/Jobs/SyncPushTokensJob.swift b/Session/Signal/SyncPushTokensJob.swift similarity index 100% rename from Session/src/Jobs/SyncPushTokensJob.swift rename to Session/Signal/SyncPushTokensJob.swift diff --git a/Session/src/util/TextFieldHelper.swift b/Session/Signal/TextFieldHelper.swift similarity index 100% rename from Session/src/util/TextFieldHelper.swift rename to Session/Signal/TextFieldHelper.swift diff --git a/Session/src/call/TurnServerInfo.swift b/Session/Signal/TurnServerInfo.swift similarity index 100% rename from Session/src/call/TurnServerInfo.swift rename to Session/Signal/TurnServerInfo.swift diff --git a/Session/src/views/TypingIndicatorView.swift b/Session/Signal/TypingIndicatorView.swift similarity index 100% rename from Session/src/views/TypingIndicatorView.swift rename to Session/Signal/TypingIndicatorView.swift diff --git a/Session/src/UIAlerts+iOS9.m b/Session/Signal/UIAlerts+iOS9.m similarity index 100% rename from Session/src/UIAlerts+iOS9.m rename to Session/Signal/UIAlerts+iOS9.m diff --git a/Session/src/UIApplication+OWS.swift b/Session/Signal/UIApplication+OWS.swift similarity index 100% rename from Session/src/UIApplication+OWS.swift rename to Session/Signal/UIApplication+OWS.swift diff --git a/Session/src/util/UI Categories/UIResponder+OWS.swift b/Session/Signal/UIResponder+OWS.swift similarity index 100% rename from Session/src/util/UI Categories/UIResponder+OWS.swift rename to Session/Signal/UIResponder+OWS.swift diff --git a/Session/src/UIStoryboard+OWS.swift b/Session/Signal/UIStoryboard+OWS.swift similarity index 100% rename from Session/src/UIStoryboard+OWS.swift rename to Session/Signal/UIStoryboard+OWS.swift diff --git a/Session/src/util/UIViewController+CameraPermissions.h b/Session/Signal/UIViewController+CameraPermissions.h similarity index 100% rename from Session/src/util/UIViewController+CameraPermissions.h rename to Session/Signal/UIViewController+CameraPermissions.h diff --git a/Session/src/util/UIViewController+Permissions.h b/Session/Signal/UIViewController+Permissions.h similarity index 100% rename from Session/src/util/UIViewController+Permissions.h rename to Session/Signal/UIViewController+Permissions.h diff --git a/Session/src/util/UIViewController+Permissions.m b/Session/Signal/UIViewController+Permissions.m similarity index 100% rename from Session/src/util/UIViewController+Permissions.m rename to Session/Signal/UIViewController+Permissions.m diff --git a/Session/src/ViewControllers/ThreadSettings/UpdateGroupViewController.h b/Session/Signal/UpdateGroupViewController.h similarity index 100% rename from Session/src/ViewControllers/ThreadSettings/UpdateGroupViewController.h rename to Session/Signal/UpdateGroupViewController.h diff --git a/Session/src/ViewControllers/ThreadSettings/UpdateGroupViewController.m b/Session/Signal/UpdateGroupViewController.m similarity index 100% rename from Session/src/ViewControllers/ThreadSettings/UpdateGroupViewController.m rename to Session/Signal/UpdateGroupViewController.m diff --git a/Session/src/UserInterface/Notifications/UserNotificationsAdaptee.swift b/Session/Signal/UserNotificationsAdaptee.swift similarity index 100% rename from Session/src/UserInterface/Notifications/UserNotificationsAdaptee.swift rename to Session/Signal/UserNotificationsAdaptee.swift diff --git a/Session/src/views/VoiceNoteLock.swift b/Session/Signal/VoiceNoteLock.swift similarity index 100% rename from Session/src/views/VoiceNoteLock.swift rename to Session/Signal/VoiceNoteLock.swift diff --git a/Session/src/call/WebRTCCallMessageHandler.swift b/Session/Signal/WebRTCCallMessageHandler.swift similarity index 100% rename from Session/src/call/WebRTCCallMessageHandler.swift rename to Session/Signal/WebRTCCallMessageHandler.swift diff --git a/Session/src/Generated/WebRTCProto.swift b/Session/Signal/WebRTCProto.swift similarity index 100% rename from Session/src/Generated/WebRTCProto.swift rename to Session/Signal/WebRTCProto.swift diff --git a/Session/src/Loki/Utilities/AppearanceUtilities.swift b/Session/Utilities/AppearanceUtilities.swift similarity index 100% rename from Session/src/Loki/Utilities/AppearanceUtilities.swift rename to Session/Utilities/AppearanceUtilities.swift diff --git a/Session/src/Loki/Utilities/AudioUtilities.swift b/Session/Utilities/AudioUtilities.swift similarity index 100% rename from Session/src/Loki/Utilities/AudioUtilities.swift rename to Session/Utilities/AudioUtilities.swift diff --git a/Session/src/Loki/Utilities/BackgroundPoller.swift b/Session/Utilities/BackgroundPoller.swift similarity index 100% rename from Session/src/Loki/Utilities/BackgroundPoller.swift rename to Session/Utilities/BackgroundPoller.swift diff --git a/Session/src/Loki/Utilities/CGRect+Utilities.swift b/Session/Utilities/CGRect+Utilities.swift similarity index 100% rename from Session/src/Loki/Utilities/CGRect+Utilities.swift rename to Session/Utilities/CGRect+Utilities.swift diff --git a/Session/src/Loki/Utilities/ContactUtilities.swift b/Session/Utilities/ContactUtilities.swift similarity index 100% rename from Session/src/Loki/Utilities/ContactUtilities.swift rename to Session/Utilities/ContactUtilities.swift diff --git a/Session/src/Loki/Utilities/IP2Country.swift b/Session/Utilities/IP2Country.swift similarity index 100% rename from Session/src/Loki/Utilities/IP2Country.swift rename to Session/Utilities/IP2Country.swift diff --git a/Session/src/Loki/Utilities/KeyPairGeneration.swift b/Session/Utilities/KeyPairGeneration.swift similarity index 100% rename from Session/src/Loki/Utilities/KeyPairGeneration.swift rename to Session/Utilities/KeyPairGeneration.swift diff --git a/Session/src/Loki/Utilities/KeyPairUtilities.swift b/Session/Utilities/KeyPairUtilities.swift similarity index 100% rename from Session/src/Loki/Utilities/KeyPairUtilities.swift rename to Session/Utilities/KeyPairUtilities.swift diff --git a/Session/src/Loki/Utilities/MentionUtilities.swift b/Session/Utilities/MentionUtilities.swift similarity index 100% rename from Session/src/Loki/Utilities/MentionUtilities.swift rename to Session/Utilities/MentionUtilities.swift diff --git a/Session/src/Loki/Utilities/QRCode.swift b/Session/Utilities/QRCode.swift similarity index 100% rename from Session/src/Loki/Utilities/QRCode.swift rename to Session/Utilities/QRCode.swift diff --git a/Session/src/Loki/Utilities/Sodium+Conversion.swift b/Session/Utilities/Sodium+Conversion.swift similarity index 100% rename from Session/src/Loki/Utilities/Sodium+Conversion.swift rename to Session/Utilities/Sodium+Conversion.swift diff --git a/Session/src/Loki/Utilities/UIImage+Scaling.swift b/Session/Utilities/UIImage+Scaling.swift similarity index 100% rename from Session/src/Loki/Utilities/UIImage+Scaling.swift rename to Session/Utilities/UIImage+Scaling.swift diff --git a/Session/src/Loki/Utilities/UILabel+Interaction.swift b/Session/Utilities/UILabel+Interaction.swift similarity index 100% rename from Session/src/Loki/Utilities/UILabel+Interaction.swift rename to Session/Utilities/UILabel+Interaction.swift diff --git a/Session/src/Loki/Utilities/UIView+Glow.swift b/Session/Utilities/UIView+Glow.swift similarity index 100% rename from Session/src/Loki/Utilities/UIView+Glow.swift rename to Session/Utilities/UIView+Glow.swift diff --git a/Session/src/Loki/Utilities/UIView+Wrapping.swift b/Session/Utilities/UIView+Wrapping.swift similarity index 100% rename from Session/src/Loki/Utilities/UIView+Wrapping.swift rename to Session/Utilities/UIView+Wrapping.swift diff --git a/Session/src/Loki/View Controllers/BaseVC.swift b/Session/View Controllers/BaseVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/BaseVC.swift rename to Session/View Controllers/BaseVC.swift diff --git a/Session/src/Loki/View Controllers/DeviceLinkingModal.swift b/Session/View Controllers/DeviceLinkingModal.swift similarity index 100% rename from Session/src/Loki/View Controllers/DeviceLinkingModal.swift rename to Session/View Controllers/DeviceLinkingModal.swift diff --git a/Session/src/Loki/View Controllers/DeviceLinkingModalDelegate.swift b/Session/View Controllers/DeviceLinkingModalDelegate.swift similarity index 100% rename from Session/src/Loki/View Controllers/DeviceLinkingModalDelegate.swift rename to Session/View Controllers/DeviceLinkingModalDelegate.swift diff --git a/Session/src/Loki/View Controllers/DeviceLinksVC.swift b/Session/View Controllers/DeviceLinksVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/DeviceLinksVC.swift rename to Session/View Controllers/DeviceLinksVC.swift diff --git a/Session/src/Loki/View Controllers/DeviceNameModal.swift b/Session/View Controllers/DeviceNameModal.swift similarity index 100% rename from Session/src/Loki/View Controllers/DeviceNameModal.swift rename to Session/View Controllers/DeviceNameModal.swift diff --git a/Session/src/Loki/View Controllers/DeviceNameModalDelegate.swift b/Session/View Controllers/DeviceNameModalDelegate.swift similarity index 100% rename from Session/src/Loki/View Controllers/DeviceNameModalDelegate.swift rename to Session/View Controllers/DeviceNameModalDelegate.swift diff --git a/Session/src/Loki/View Controllers/DisplayNameVC.swift b/Session/View Controllers/DisplayNameVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/DisplayNameVC.swift rename to Session/View Controllers/DisplayNameVC.swift diff --git a/Session/src/Loki/View Controllers/EditClosedGroupVC.swift b/Session/View Controllers/EditClosedGroupVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/EditClosedGroupVC.swift rename to Session/View Controllers/EditClosedGroupVC.swift diff --git a/Session/src/Loki/View Controllers/GroupMembersVC.swift b/Session/View Controllers/GroupMembersVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/GroupMembersVC.swift rename to Session/View Controllers/GroupMembersVC.swift diff --git a/Session/src/Loki/View Controllers/HomeVC.swift b/Session/View Controllers/HomeVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/HomeVC.swift rename to Session/View Controllers/HomeVC.swift diff --git a/Session/src/Loki/View Controllers/JoinPublicChatVC.swift b/Session/View Controllers/JoinPublicChatVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/JoinPublicChatVC.swift rename to Session/View Controllers/JoinPublicChatVC.swift diff --git a/Session/src/Loki/View Controllers/LandingVC.swift b/Session/View Controllers/LandingVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/LandingVC.swift rename to Session/View Controllers/LandingVC.swift diff --git a/Session/src/Loki/View Controllers/LightModeSheet.swift b/Session/View Controllers/LightModeSheet.swift similarity index 100% rename from Session/src/Loki/View Controllers/LightModeSheet.swift rename to Session/View Controllers/LightModeSheet.swift diff --git a/Session/src/Loki/View Controllers/LinkDeviceVC.swift b/Session/View Controllers/LinkDeviceVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/LinkDeviceVC.swift rename to Session/View Controllers/LinkDeviceVC.swift diff --git a/Session/src/Loki/View Controllers/LinkDeviceVCDelegate.swift b/Session/View Controllers/LinkDeviceVCDelegate.swift similarity index 100% rename from Session/src/Loki/View Controllers/LinkDeviceVCDelegate.swift rename to Session/View Controllers/LinkDeviceVCDelegate.swift diff --git a/Session/src/Loki/View Controllers/Modal.swift b/Session/View Controllers/Modal.swift similarity index 100% rename from Session/src/Loki/View Controllers/Modal.swift rename to Session/View Controllers/Modal.swift diff --git a/Session/src/Loki/View Controllers/MultiDeviceRemovalSheet.swift b/Session/View Controllers/MultiDeviceRemovalSheet.swift similarity index 100% rename from Session/src/Loki/View Controllers/MultiDeviceRemovalSheet.swift rename to Session/View Controllers/MultiDeviceRemovalSheet.swift diff --git a/Session/src/Loki/View Controllers/NewClosedGroupVC.swift b/Session/View Controllers/NewClosedGroupVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/NewClosedGroupVC.swift rename to Session/View Controllers/NewClosedGroupVC.swift diff --git a/Session/src/Loki/View Controllers/NewPrivateChatVC.swift b/Session/View Controllers/NewPrivateChatVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/NewPrivateChatVC.swift rename to Session/View Controllers/NewPrivateChatVC.swift diff --git a/Session/src/Loki/View Controllers/NukeDataModal.swift b/Session/View Controllers/NukeDataModal.swift similarity index 100% rename from Session/src/Loki/View Controllers/NukeDataModal.swift rename to Session/View Controllers/NukeDataModal.swift diff --git a/Session/src/Loki/View Controllers/OpenGroupSuggestionSheet.swift b/Session/View Controllers/OpenGroupSuggestionSheet.swift similarity index 100% rename from Session/src/Loki/View Controllers/OpenGroupSuggestionSheet.swift rename to Session/View Controllers/OpenGroupSuggestionSheet.swift diff --git a/Session/src/Loki/View Controllers/PNModeVC.swift b/Session/View Controllers/PNModeVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/PNModeVC.swift rename to Session/View Controllers/PNModeVC.swift diff --git a/Session/src/Loki/View Controllers/PathVC.swift b/Session/View Controllers/PathVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/PathVC.swift rename to Session/View Controllers/PathVC.swift diff --git a/Session/src/Loki/View Controllers/QRCodeVC.swift b/Session/View Controllers/QRCodeVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/QRCodeVC.swift rename to Session/View Controllers/QRCodeVC.swift diff --git a/Session/src/Loki/View Controllers/RegisterVC.swift b/Session/View Controllers/RegisterVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/RegisterVC.swift rename to Session/View Controllers/RegisterVC.swift diff --git a/Session/src/Loki/View Controllers/RestoreVC.swift b/Session/View Controllers/RestoreVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/RestoreVC.swift rename to Session/View Controllers/RestoreVC.swift diff --git a/Session/src/Loki/View Controllers/ScanQRCodeWrapperVC.swift b/Session/View Controllers/ScanQRCodeWrapperVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/ScanQRCodeWrapperVC.swift rename to Session/View Controllers/ScanQRCodeWrapperVC.swift diff --git a/Session/src/Loki/View Controllers/SeedModal.swift b/Session/View Controllers/SeedModal.swift similarity index 100% rename from Session/src/Loki/View Controllers/SeedModal.swift rename to Session/View Controllers/SeedModal.swift diff --git a/Session/src/Loki/View Controllers/SeedVC.swift b/Session/View Controllers/SeedVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/SeedVC.swift rename to Session/View Controllers/SeedVC.swift diff --git a/Session/src/Loki/View Controllers/SettingsVC.swift b/Session/View Controllers/SettingsVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/SettingsVC.swift rename to Session/View Controllers/SettingsVC.swift diff --git a/Session/src/Loki/View Controllers/Sheet.swift b/Session/View Controllers/Sheet.swift similarity index 100% rename from Session/src/Loki/View Controllers/Sheet.swift rename to Session/View Controllers/Sheet.swift diff --git a/Session/src/Loki/View Controllers/UserSelectionVC.swift b/Session/View Controllers/UserSelectionVC.swift similarity index 100% rename from Session/src/Loki/View Controllers/UserSelectionVC.swift rename to Session/View Controllers/UserSelectionVC.swift diff --git a/Session/iTunesArtwork@3x.png b/Session/iTunesArtwork@3x.png deleted file mode 100644 index 1ebe90b714faff80714a472c0cd092bbff7b8357..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14942 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 KwDUFXg8vUSH`cTO diff --git a/Session/src/UserInterface/OWSLayerView.swift b/Session/src/UserInterface/OWSLayerView.swift deleted file mode 100644 index d1bbbfd05..000000000 --- a/Session/src/UserInterface/OWSLayerView.swift +++ /dev/null @@ -1,50 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -import Foundation - -@objc -class OWSLayerView: UIView { - let layoutCallback: ((UIView) -> Void) - - @objc - public required init(frame: CGRect, layoutCallback : @escaping (UIView) -> Void) { - self.layoutCallback = layoutCallback - super.init(frame: frame) - } - - required init?(coder aDecoder: NSCoder) { - self.layoutCallback = { _ in - } - super.init(coder: aDecoder) - } - - override var bounds: CGRect { - didSet { - updateLayer() - } - } - - override var frame: CGRect { - didSet { - updateLayer() - } - } - - override var center: CGPoint { - didSet { - updateLayer() - } - } - - private func updateLayer() { - // Prevent the shape layer from animating changes. - CATransaction.begin() - CATransaction.setDisableActions(true) - - layoutCallback(self) - - CATransaction.commit() - } -} diff --git a/Session/src/ViewControllers/DebugSettingsTableViewController.m b/Session/src/ViewControllers/DebugSettingsTableViewController.m deleted file mode 100644 index 956c02187..000000000 --- a/Session/src/ViewControllers/DebugSettingsTableViewController.m +++ /dev/null @@ -1,75 +0,0 @@ -// -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. -// - -#import "DebugSettingsTableViewController.h" -#import "UIFont+OWS.h" -#import -#import - -@implementation DebugSettingsTableViewController - -- (void)loadView -{ - self.tableViewStyle = UITableViewStylePlain; - [super loadView]; -} - -- (void)viewDidLoad -{ - [super viewDidLoad]; - - [self.navigationController.navigationBar setTranslucent:NO]; - - self.title = @"Debugging"; - - [self updateTableContents]; -} - -- (void)viewWillAppear:(BOOL)animated -{ - [super viewWillAppear:animated]; - - [self updateTableContents]; -} - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - Table Contents - -- (void)updateTableContents -{ - OWSTableContents *contents = [OWSTableContents new]; - OWSTableSection *section = [OWSTableSection new]; - - __block NSUInteger threadCount; - __block NSUInteger messageCount; - [TSStorageManager.sharedManager.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { - threadCount = [[transaction ext:TSThreadDatabaseViewExtensionName] numberOfItemsInAllGroups]; - messageCount = [[transaction ext:TSMessageDatabaseViewExtensionName] numberOfItemsInAllGroups]; - }]; - - [section addItem:[OWSTableItem labelItemWithText:[NSString stringWithFormat:@"Threads: %zd", threadCount]]]; - [section addItem:[OWSTableItem labelItemWithText:[NSString stringWithFormat:@"Messages: %zd", messageCount]]]; - - [contents addSection:section]; - - self.contents = contents; -} - -#pragma mark - Logging - -+ (NSString *)tag -{ - return [NSString stringWithFormat:@"[%@]", self.class]; -} - -- (NSString *)tag -{ - return self.class.tag; -} - -@end diff --git a/Session/src/ViewControllers/DebugUI/DebugContactsUtils.h b/Session/src/ViewControllers/DebugUI/DebugContactsUtils.h deleted file mode 100644 index 41396a687..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugContactsUtils.h +++ /dev/null @@ -1,25 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -NS_ASSUME_NONNULL_BEGIN - -@class CNContact; - -@interface DebugContactsUtils : NSObject - -+ (NSString *)randomPhoneNumber; - -+ (void)createRandomContacts:(NSUInteger)count; - -+ (void)createRandomContacts:(NSUInteger)count - contactHandler: - (nullable void (^)(CNContact *_Nonnull contact, NSUInteger idx, BOOL *_Nonnull stop))contactHandler; - -+ (void)deleteAllContacts; - -+ (void)deleteAllRandomContacts; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugContactsUtils.m b/Session/src/ViewControllers/DebugUI/DebugContactsUtils.m deleted file mode 100644 index 92f792478..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugContactsUtils.m +++ /dev/null @@ -1,1259 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "DebugContactsUtils.h" -#import "Session-Swift.h" -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@implementation DebugContactsUtils - -+ (NSString *)randomFirstName -{ - NSArray *values = @[ - @"Alice", - @"Arthur", - @"Bertha", - @"Bob", - @"Carol", - @"Carole", - @"Carlos", - @"Charlie", - @"Chuck", - @"Craig", - @"Dan", - @"Dave", - @"David", - @"Erin", - @"Eve", - @"Faythe", - @"Frank", - @"Grace", - @"Heidi", - @"Lilia", - @"Mallory", - @"Mallet", - @"Moxie", - @"Oscar", - @"Peggy", - @"Pat", - @"Paul", - @"Riya", - @"Scott", - @"Sybil", - @"Trent", - @"Ted", - @"Trevor", - @"Trudy", - @"Victor", - @"Vanna", - @"Walter", - @"Wendy", - @"Merlin", - ]; - return values[(NSUInteger)arc4random_uniform((uint32_t)values.count)]; -} - -+ (NSString *)randomLastName -{ - NSArray *values = @[ - @"Smith", - @"Johnson", - @"Williams", - @"Jones", - @"Brown", - @"Davis", - @"Miller", - @"Wilson", - @"Moore", - @"Taylor", - @"Anderson", - @"Thomas", - @"Jackson", - @"White", - @"Harris", - @"Martin", - @"Thompson", - @"Garcia", - @"Martinez", - @"Robinson", - @"Clark", - @"Rodriguez", - @"Lewis", - @"Lee", - @"Walker", - @"Hall", - @"Allen", - @"Young", - @"Hernandez", - @"King", - @"Wright", - @"Lopez", - @"Hill", - @"Scott", - @"Green", - @"Adams", - @"Baker", - @"Gonzalez", - @"Nelson", - @"Carter", - @"Mitchell", - @"Perez", - @"Roberts", - @"Turner", - @"Phillips", - @"Campbell", - @"Parker", - @"Evans", - @"Edwards", - @"Collins", - @"Stewart", - @"Sanchez", - @"Morris", - @"Rogers", - @"Reed", - @"Cook", - @"Morgan", - @"Bell", - @"Murphy", - @"Bailey", - @"Rivera", - @"Cooper", - @"Richardson", - @"Cox", - @"Howard", - @"Ward", - @"Torres", - @"Peterson", - @"Gray", - @"Ramirez", - @"James", - @"Watson", - @"Brooks", - @"Kelly", - @"Sanders", - @"Price", - @"Bennett", - @"Wood", - @"Barnes", - @"Ross", - @"Henderson", - @"Coleman", - @"Jenkins", - @"Perry", - @"Powell", - @"Long", - @"Patterson", - @"Hughes", - @"Flores", - @"Washington", - @"Butler", - @"Simmons", - @"Foster", - @"Gonzales", - @"Bryant", - @"Alexander", - @"Russell", - @"Griffin", - @"Diaz", - @"Hayes", - @"Myers", - @"Ford", - @"Hamilton", - @"Graham", - @"Sullivan", - @"Wallace", - @"Woods", - @"Cole", - @"West", - @"Jordan", - @"Owens", - @"Reynolds", - @"Fisher", - @"Ellis", - @"Harrison", - @"Gibson", - @"Mcdonald", - @"Cruz", - @"Marshall", - @"Ortiz", - @"Gomez", - @"Murray", - @"Freeman", - @"Wells", - @"Webb", - @"Simpson", - @"Stevens", - @"Tucker", - @"Porter", - @"Hunter", - @"Hicks", - @"Crawford", - @"Henry", - @"Boyd", - @"Mason", - @"Morales", - @"Kennedy", - @"Warren", - @"Dixon", - @"Ramos", - @"Reyes", - @"Burns", - @"Gordon", - @"Shaw", - @"Holmes", - @"Rice", - @"Robertson", - @"Hunt", - @"Black", - @"Daniels", - @"Palmer", - @"Mills", - @"Nichols", - @"Grant", - @"Knight", - @"Ferguson", - @"Rose", - @"Stone", - @"Hawkins", - @"Dunn", - @"Perkins", - @"Hudson", - @"Spencer", - @"Gardner", - @"Stephens", - @"Payne", - @"Pierce", - @"Berry", - @"Matthews", - @"Arnold", - @"Wagner", - @"Willis", - @"Ray", - @"Watkins", - @"Olson", - @"Carroll", - @"Duncan", - @"Snyder", - @"Hart", - @"Cunningham", - @"Bradley", - @"Lane", - @"Andrews", - @"Ruiz", - @"Harper", - @"Fox", - @"Riley", - @"Armstrong", - @"Carpenter", - @"Weaver", - @"Greene", - @"Lawrence", - @"Elliott", - @"Chavez", - @"Sims", - @"Austin", - @"Peters", - @"Kelley", - @"Franklin", - @"Lawson", - @"Fields", - @"Gutierrez", - @"Ryan", - @"Schmidt", - @"Carr", - @"Vasquez", - @"Castillo", - @"Wheeler", - @"Chapman", - @"Oliver", - @"Montgomery", - @"Richards", - @"Williamson", - @"Johnston", - @"Banks", - @"Meyer", - @"Bishop", - @"Mccoy", - @"Howell", - @"Alvarez", - @"Morrison", - @"Hansen", - @"Fernandez", - @"Garza", - @"Harvey", - @"Little", - @"Burton", - @"Stanley", - @"Nguyen", - @"George", - @"Jacobs", - @"Reid", - @"Kim", - @"Fuller", - @"Lynch", - @"Dean", - @"Gilbert", - @"Garrett", - @"Romero", - @"Welch", - @"Larson", - @"Frazier", - @"Burke", - @"Hanson", - @"Day", - @"Mendoza", - @"Moreno", - @"Bowman", - @"Medina", - @"Fowler", - @"Brewer", - @"Hoffman", - @"Carlson", - @"Silva", - @"Pearson", - @"Holland", - @"Douglas", - @"Fleming", - @"Jensen", - @"Vargas", - @"Byrd", - @"Davidson", - @"Hopkins", - @"May", - @"Terry", - @"Herrera", - @"Wade", - @"Soto", - @"Walters", - @"Curtis", - @"Neal", - @"Caldwell", - @"Lowe", - @"Jennings", - @"Barnett", - @"Graves", - @"Jimenez", - @"Horton", - @"Shelton", - @"Barrett", - @"O'brien", - @"Castro", - @"Sutton", - @"Gregory", - @"Mckinney", - @"Lucas", - @"Miles", - @"Craig", - @"Rodriquez", - @"Chambers", - @"Holt", - @"Lambert", - @"Fletcher", - @"Watts", - @"Bates", - @"Hale", - @"Rhodes", - @"Pena", - @"Beck", - @"Newman", - @"Haynes", - @"Mcdaniel", - @"Mendez", - @"Bush", - @"Vaughn", - @"Parks", - @"Dawson", - @"Santiago", - @"Norris", - @"Hardy", - @"Love", - @"Steele", - @"Curry", - @"Powers", - @"Schultz", - @"Barker", - @"Guzman", - @"Page", - @"Munoz", - @"Ball", - @"Keller", - @"Chandler", - @"Weber", - @"Leonard", - @"Walsh", - @"Lyons", - @"Ramsey", - @"Wolfe", - @"Schneider", - @"Mullins", - @"Benson", - @"Sharp", - @"Bowen", - @"Daniel", - @"Barber", - @"Cummings", - @"Hines", - @"Baldwin", - @"Griffith", - @"Valdez", - @"Hubbard", - @"Salazar", - @"Reeves", - @"Warner", - @"Stevenson", - @"Burgess", - @"Santos", - @"Tate", - @"Cross", - @"Garner", - @"Mann", - @"Mack", - @"Moss", - @"Thornton", - @"Dennis", - @"Mcgee", - @"Farmer", - @"Delgado", - @"Aguilar", - @"Vega", - @"Glover", - @"Manning", - @"Cohen", - @"Harmon", - @"Rodgers", - @"Robbins", - @"Newton", - @"Todd", - @"Blair", - @"Higgins", - @"Ingram", - @"Reese", - @"Cannon", - @"Strickland", - @"Townsend", - @"Potter", - @"Goodwin", - @"Walton", - @"Rowe", - @"Hampton", - @"Ortega", - @"Patton", - @"Swanson", - @"Joseph", - @"Francis", - @"Goodman", - @"Maldonado", - @"Yates", - @"Becker", - @"Erickson", - @"Hodges", - @"Rios", - @"Conner", - @"Adkins", - @"Webster", - @"Norman", - @"Malone", - @"Hammond", - @"Flowers", - @"Cobb", - @"Moody", - @"Quinn", - @"Blake", - @"Maxwell", - @"Pope", - @"Floyd", - @"Osborne", - @"Paul", - @"Mccarthy", - @"Guerrero", - @"Lindsey", - @"Estrada", - @"Sandoval", - @"Gibbs", - @"Tyler", - @"Gross", - @"Fitzgerald", - @"Stokes", - @"Doyle", - @"Sherman", - @"Saunders", - @"Wise", - @"Colon", - @"Gill", - @"Alvarado", - @"Greer", - @"Padilla", - @"Simon", - @"Waters", - @"Nunez", - @"Ballard", - @"Schwartz", - @"Mcbride", - @"Houston", - @"Christensen", - @"Klein", - @"Pratt", - @"Briggs", - @"Parsons", - @"Mclaughlin", - @"Zimmerman", - @"French", - @"Buchanan", - @"Moran", - @"Copeland", - @"Roy", - @"Pittman", - @"Brady", - @"Mccormick", - @"Holloway", - @"Brock", - @"Poole", - @"Frank", - @"Logan", - @"Owen", - @"Bass", - @"Marsh", - @"Drake", - @"Wong", - @"Jefferson", - @"Park", - @"Morton", - @"Abbott", - @"Sparks", - @"Patrick", - @"Norton", - @"Huff", - @"Clayton", - @"Massey", - @"Lloyd", - @"Figueroa", - @"Carson", - @"Bowers", - @"Roberson", - @"Barton", - @"Tran", - @"Lamb", - @"Harrington", - @"Casey", - @"Boone", - @"Cortez", - @"Clarke", - @"Mathis", - @"Singleton", - @"Wilkins", - @"Cain", - @"Bryan", - @"Underwood", - @"Hogan", - @"Mckenzie", - @"Collier", - @"Luna", - @"Phelps", - @"Mcguire", - @"Allison", - @"Bridges", - @"Wilkerson", - @"Nash", - @"Summers", - @"Atkins", - @"Wilcox", - @"Pitts", - @"Conley", - @"Marquez", - @"Burnett", - @"Richard", - @"Cochran", - @"Chase", - @"Davenport", - @"Hood", - @"Gates", - @"Clay", - @"Ayala", - @"Sawyer", - @"Roman", - @"Vazquez", - @"Dickerson", - @"Hodge", - @"Acosta", - @"Flynn", - @"Espinoza", - @"Nicholson", - @"Monroe", - @"Wolf", - @"Morrow", - @"Kirk", - @"Randall", - @"Anthony", - @"Whitaker", - @"O'connor", - @"Skinner", - @"Ware", - @"Molina", - @"Kirby", - @"Huffman", - @"Bradford", - @"Charles", - @"Gilmore", - @"Dominguez", - @"O'neal", - @"Bruce", - @"Lang", - @"Combs", - @"Kramer", - @"Heath", - @"Hancock", - @"Gallagher", - @"Gaines", - @"Shaffer", - @"Short", - @"Wiggins", - @"Mathews", - @"Mcclain", - @"Fischer", - @"Wall", - @"Small", - @"Melton", - @"Hensley", - @"Bond", - @"Dyer", - @"Cameron", - @"Grimes", - @"Contreras", - @"Christian", - @"Wyatt", - @"Baxter", - @"Snow", - @"Mosley", - @"Shepherd", - @"Larsen", - @"Hoover", - @"Beasley", - @"Glenn", - @"Petersen", - @"Whitehead", - @"Meyers", - @"Keith", - @"Garrison", - @"Vincent", - @"Shields", - @"Horn", - @"Savage", - @"Olsen", - @"Schroeder", - @"Hartman", - @"Woodard", - @"Mueller", - @"Kemp", - @"Deleon", - @"Booth", - @"Patel", - @"Calhoun", - @"Wiley", - @"Eaton", - @"Cline", - @"Navarro", - @"Harrell", - @"Lester", - @"Humphrey", - @"Parrish", - @"Duran", - @"Hutchinson", - @"Hess", - @"Dorsey", - @"Bullock", - @"Robles", - @"Beard", - @"Dalton", - @"Avila", - @"Vance", - @"Rich", - @"Blackwell", - @"York", - @"Johns", - @"Blankenship", - @"Trevino", - @"Salinas", - @"Campos", - @"Pruitt", - @"Moses", - @"Callahan", - @"Golden", - @"Montoya", - @"Hardin", - @"Guerra", - @"Mcdowell", - @"Carey", - @"Stafford", - @"Gallegos", - @"Henson", - @"Wilkinson", - @"Booker", - @"Merritt", - @"Miranda", - @"Atkinson", - @"Orr", - @"Decker", - @"Hobbs", - @"Preston", - @"Tanner", - @"Knox", - @"Pacheco", - @"Stephenson", - @"Glass", - @"Rojas", - @"Serrano", - @"Marks", - @"Hickman", - @"English", - @"Sweeney", - @"Strong", - @"Prince", - @"Mcclure", - @"Conway", - @"Walter", - @"Roth", - @"Maynard", - @"Farrell", - @"Lowery", - @"Hurst", - @"Nixon", - @"Weiss", - @"Trujillo", - @"Ellison", - @"Sloan", - @"Juarez", - @"Winters", - @"Mclean", - @"Randolph", - @"Leon", - @"Boyer", - @"Villarreal", - @"Mccall", - @"Gentry", - @"Carrillo", - @"Kent", - @"Ayers", - @"Lara", - @"Shannon", - @"Sexton", - @"Pace", - @"Hull", - @"Leblanc", - @"Browning", - @"Velasquez", - @"Leach", - @"Chang", - @"House", - @"Sellers", - @"Herring", - @"Noble", - @"Foley", - @"Bartlett", - @"Mercado", - @"Landry", - @"Durham", - @"Walls", - @"Barr", - @"Mckee", - @"Bauer", - @"Rivers", - @"Everett", - @"Bradshaw", - @"Pugh", - @"Velez", - @"Rush", - @"Estes", - @"Dodson", - @"Morse", - @"Sheppard", - @"Weeks", - @"Camacho", - @"Bean", - @"Barron", - @"Livingston", - @"Middleton", - @"Spears", - @"Branch", - @"Blevins", - @"Chen", - @"Kerr", - @"Mcconnell", - @"Hatfield", - @"Harding", - @"Ashley", - @"Solis", - @"Herman", - @"Frost", - @"Giles", - @"Blackburn", - @"William", - @"Pennington", - @"Woodward", - @"Finley", - @"Mcintosh", - @"Koch", - @"Best", - @"Solomon", - @"Mccullough", - @"Dudley", - @"Nolan", - @"Blanchard", - @"Rivas", - @"Brennan", - @"Mejia", - @"Kane", - @"Benton", - @"Joyce", - @"Buckley", - @"Haley", - @"Valentine", - @"Maddox", - @"Russo", - @"Mcknight", - @"Buck", - @"Moon", - @"Mcmillan", - @"Crosby", - @"Berg", - @"Dotson", - @"Mays", - @"Roach", - @"Church", - @"Chan", - @"Richmond", - @"Meadows", - @"Faulkner", - @"O'neill", - @"Knapp", - @"Kline", - @"Barry", - @"Ochoa", - @"Jacobson", - @"Gay", - @"Avery", - @"Hendricks", - @"Horne", - @"Shepard", - @"Hebert", - @"Cherry", - @"Cardenas", - @"Mcintyre", - @"Whitney", - @"Waller", - @"Holman", - @"Donaldson", - @"Cantu", - @"Terrell", - @"Morin", - @"Gillespie", - @"Fuentes", - @"Tillman", - @"Sanford", - @"Bentley", - @"Peck", - @"Key", - @"Salas", - @"Rollins", - @"Gamble", - @"Dickson", - @"Battle", - @"Santana", - @"Cabrera", - @"Cervantes", - @"Howe", - @"Hinton", - @"Hurley", - @"Spence", - @"Zamora", - @"Yang", - @"Mcneil", - @"Suarez", - @"Case", - @"Petty", - @"Gould", - @"Mcfarland", - @"Sampson", - @"Carver", - @"Bray", - @"Rosario", - @"Macdonald", - @"Stout", - @"Hester", - @"Melendez", - @"Dillon", - @"Farley", - @"Hopper", - @"Galloway", - @"Potts", - @"Bernard", - @"Joyner", - @"Stein", - @"Aguirre", - @"Osborn", - @"Mercer", - @"Bender", - @"Franco", - @"Rowland", - @"Sykes", - @"Benjamin", - @"Travis", - @"Pickett", - @"Crane", - @"Sears", - @"Mayo", - @"Dunlap", - @"Hayden", - @"Wilder", - @"Mckay", - @"Coffey", - @"Mccarty", - @"Ewing", - @"Cooley", - @"Vaughan", - @"Bonner", - @"Cotton", - @"Holder", - @"Stark", - @"Ferrell", - @"Cantrell", - @"Fulton", - @"Lynn", - @"Lott", - @"Calderon", - @"Rosa", - @"Pollard", - @"Hooper", - @"Burch", - @"Mullen", - @"Fry", - @"Riddle", - @"Levy", - @"David", - @"Duke", - @"O'donnell", - @"Guy", - @"Michael", - @"Britt", - @"Frederick", - @"Daugherty", - @"Berger", - @"Dillard", - @"Alston", - @"Jarvis", - @"Frye", - @"Riggs", - @"Chaney", - @"Odom", - @"Duffy", - @"Fitzpatrick", - @"Valenzuela", - @"Merrill", - @"Mayer", - @"Alford", - @"Mcpherson", - @"Acevedo", - @"Donovan", - @"Barrera", - @"Albert", - @"Cote", - @"Reilly", - @"Compton", - @"Raymond", - @"Mooney", - @"Mcgowan", - @"Craft", - @"Cleveland", - @"Clemons", - @"Wynn", - @"Nielsen", - @"Baird", - @"Stanton", - @"Snider", - @"Rosales", - @"Bright", - @"Witt", - @"Stuart", - @"Hays", - @"Holden", - @"Rutledge", - @"Kinney", - @"Clements", - @"Castaneda", - @"Slater", - @"Hahn", - @"Emerson", - @"Conrad", - @"Burks", - @"Delaney", - @"Pate", - @"Lancaster", - @"Sweet", - @"Justice", - @"Tyson", - @"Sharpe", - @"Whitfield", - @"Talley", - @"Macias", - @"Irwin", - @"Burris", - @"Ratliff", - @"Mccray", - @"Madden", - @"Kaufman", - @"Beach", - @"Goff", - @"Cash", - @"Bolton", - @"Mcfadden", - @"Levine", - @"Good", - @"Byers", - @"Kirkland", - @"Kidd", - @"Workman", - @"Carney", - @"Dale", - @"Mcleod", - @"Holcomb", - @"England", - @"Finch", - @"Head", - @"Burt", - @"Hendrix", - @"Sosa", - @"Haney", - @"Franks", - @"Sargent", - @"Nieves", - @"Downs", - @"Rasmussen", - @"Bird", - @"Hewitt", - @"Lindsay", - @"Le", - @"Foreman", - @"Valencia", - @"O'neil", - @"Delacruz", - @"Vinson", - @"Dejesus", - @"Hyde", - @"Forbes", - @"Gilliam", - @"Guthrie", - @"Wooten", - @"Huber", - @"Barlow", - @"Boyle", - @"Mcmahon", - @"Buckner", - @"Rocha", - @"Puckett", - @"Langley", - @"Knowles", - @"Cooke", - @"Velazquez", - @"Whitley", - @"Noel", - @"Vang", - ]; - - uint32_t index = arc4random_uniform((uint32_t)values.count); - return values[index]; -} - -+ (NSString *)randomPhoneNumber -{ - if (arc4random_uniform(2) == 0) { - // Generate a US phone number. - NSMutableString *result = [@"+1" mutableCopy]; - for (int i = 0; i < 10; i++) { - // Add digits. - [result appendString:[@(arc4random_uniform(10)) description]]; - } - return result; - } else { - // Generate a UK phone number. - NSMutableString *result = [@"+441" mutableCopy]; - for (int i = 0; i < 9; i++) { - // Add digits. - [result appendString:[@(arc4random_uniform(10)) description]]; - } - return result; - } -} - -+ (void)createRandomContacts:(NSUInteger)count -{ - [self createRandomContacts:count contactHandler:nil]; -} - -+ (void)createRandomContacts:(NSUInteger)count - contactHandler: - (nullable void (^)(CNContact *_Nonnull contact, NSUInteger idx, BOOL *_Nonnull stop))contactHandler -{ - OWSAssertDebug(count > 0); - - NSUInteger remainder = count; - const NSUInteger kMaxBatchSize = 20; - NSUInteger batch = MIN(kMaxBatchSize, remainder); - remainder -= batch; - [self createRandomContactsBatch:batch - contactHandler:contactHandler - batchCompletionHandler:^{ - if (remainder > 0) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self createRandomContacts:remainder contactHandler:contactHandler]; - }); - } - }]; -} - -+ (void)createRandomContactsBatch:(NSUInteger)count - contactHandler:(nullable void (^)( - CNContact *_Nonnull contact, NSUInteger idx, BOOL *_Nonnull stop))contactHandler - batchCompletionHandler:(nullable void (^)(void))batchCompletionHandler -{ - OWSAssertDebug(count > 0); - OWSAssertDebug(batchCompletionHandler); - - OWSLogDebug(@"createRandomContactsBatch: %zu", count); - - CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]; - if (status == CNAuthorizationStatusDenied || status == CNAuthorizationStatusRestricted) { - [OWSAlerts showAlertWithTitle:@"Error" message:@"No contacts access."]; - return; - } - - NSMutableArray *contacts = [NSMutableArray new]; - CNContactStore *store = [[CNContactStore alloc] init]; - [store requestAccessForEntityType:CNEntityTypeContacts - completionHandler:^(BOOL granted, NSError *_Nullable error) { - if (!granted || error) { - dispatch_async(dispatch_get_main_queue(), ^{ - [OWSAlerts showAlertWithTitle:@"Error" message:@"No contacts access."]; - }); - return; - } - - CNSaveRequest *request = [[CNSaveRequest alloc] init]; - for (NSUInteger i = 0; i < count; i++) { - @autoreleasepool { - CNMutableContact *contact = [[CNMutableContact alloc] init]; - contact.familyName = [@"Rando-" stringByAppendingString:[self randomLastName]]; - contact.givenName = [self randomFirstName]; - - NSString *phoneString = [self randomPhoneNumber]; - CNLabeledValue *homePhone = [CNLabeledValue - labeledValueWithLabel:CNLabelHome - value:[CNPhoneNumber phoneNumberWithStringValue:phoneString]]; - contact.phoneNumbers = @[ homePhone ]; - - // 50% chance of fake contact having an avatar - const NSUInteger kPercentWithAvatar = 50; - const NSUInteger kMinimumAvatarDiameter = 200; - const NSUInteger kMaximumAvatarDiameter = 800; - OWSAssertDebug(kMaximumAvatarDiameter >= kMinimumAvatarDiameter); - if (arc4random_uniform(100) < kPercentWithAvatar) { - NSUInteger avatarDiameter - = arc4random_uniform(kMaximumAvatarDiameter - kMinimumAvatarDiameter) - + kMinimumAvatarDiameter; - // Note this doesn't work on iOS9, since iOS9 doesn't generate the - // imageThumbnailData from programmatically assigned imageData. We could make our - // own thumbnail in Contact.m, but it's not worth it for the sake of debug UI. - contact.imageData = UIImageJPEGRepresentation( - [OWSAvatarBuilder buildRandomAvatarWithDiameter:avatarDiameter], (CGFloat)0.9); - OWSLogDebug(@"avatar size: %lu bytes", (unsigned long)contact.imageData.length); - } - - [contacts addObject:contact]; - [request addContact:contact toContainerWithIdentifier:nil]; - } - } - - OWSLogError(@"Saving fake contacts: %zu", contacts.count); - - NSError *saveError = nil; - if (![store executeSaveRequest:request error:&saveError]) { - OWSLogError(@"Error saving fake contacts: %@", saveError); - [OWSAlerts showAlertWithTitle:@"Error" message:saveError.localizedDescription]; - } else { - if (contactHandler) { - [contacts enumerateObjectsUsingBlock:contactHandler]; - } - } - if (batchCompletionHandler) { - batchCompletionHandler(); - } - }]; -} - -+ (void)deleteContactsWithFilter:(BOOL (^_Nonnull)(CNContact *contact))filterBlock -{ - OWSAssertDebug(filterBlock); - - CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]; - if (status == CNAuthorizationStatusDenied || status == CNAuthorizationStatusRestricted) { - [OWSAlerts showAlertWithTitle:@"Error" message:@"No contacts access."]; - return; - } - - CNContactStore *store = [[CNContactStore alloc] init]; - [store requestAccessForEntityType:CNEntityTypeContacts - completionHandler:^(BOOL granted, NSError *_Nullable error) { - if (!granted || error) { - dispatch_async(dispatch_get_main_queue(), ^{ - [OWSAlerts showAlertWithTitle:@"Error" message:@"No contacts access."]; - }); - return; - } - - CNContactFetchRequest *fetchRequest = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[ - CNContactIdentifierKey, - CNContactGivenNameKey, - CNContactFamilyNameKey, - [CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName], - ]]; - CNSaveRequest *request = [[CNSaveRequest alloc] init]; - NSError *fetchError = nil; - BOOL result = - [store enumerateContactsWithFetchRequest:fetchRequest - error:&fetchError - usingBlock:^(CNContact *contact, BOOL *stop) { - if (filterBlock(contact)) { - [request deleteContact:[contact mutableCopy]]; - } - }]; - - NSError *saveError = nil; - if (!result || fetchError) { - OWSLogError(@"error = %@", fetchError); - [OWSAlerts showAlertWithTitle:@"Error" message:fetchError.localizedDescription]; - } else if (![store executeSaveRequest:request error:&saveError]) { - OWSLogError(@"error = %@", saveError); - [OWSAlerts showAlertWithTitle:@"Error" message:saveError.localizedDescription]; - } - }]; -} - -+ (void)deleteAllContacts -{ - [self deleteContactsWithFilter:^(CNContact *contact) { - return YES; - }]; -} - -+ (void)deleteAllRandomContacts -{ - [self deleteContactsWithFilter:^(CNContact *contact) { - return [contact.familyName hasPrefix:@"Rando-"]; - }]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIBackup.h b/Session/src/ViewControllers/DebugUI/DebugUIBackup.h deleted file mode 100644 index 8f437ef41..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIBackup.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIPage.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DebugUIBackup : DebugUIPage - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIBackup.m b/Session/src/ViewControllers/DebugUI/DebugUIBackup.m deleted file mode 100644 index a4c5fd04c..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIBackup.m +++ /dev/null @@ -1,258 +0,0 @@ -// -// Copyright (c) 2019 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIBackup.h" -#import "OWSBackup.h" -#import "OWSTableViewController.h" -#import "Session-Swift.h" -#import -#import - -@import CloudKit; - -NS_ASSUME_NONNULL_BEGIN - -@implementation DebugUIBackup - -#pragma mark - Dependencies - -+ (TSAccountManager *)tsAccountManager -{ - OWSAssertDebug(SSKEnvironment.shared.tsAccountManager); - - return SSKEnvironment.shared.tsAccountManager; -} - -+ (OWSBackup *)backup -{ - OWSAssertDebug(AppEnvironment.shared.backup); - - return AppEnvironment.shared.backup; -} - -#pragma mark - Factory Methods - -- (NSString *)name -{ - return @"Backup"; -} - -- (nullable OWSTableSection *)sectionForThread:(nullable TSThread *)thread -{ - NSMutableArray *items = [NSMutableArray new]; - [items addObject:[OWSTableItem itemWithTitle:@"Backup test file to CloudKit" - actionBlock:^{ - [DebugUIBackup backupTestFile]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Check for CloudKit backup" - actionBlock:^{ - [DebugUIBackup checkForBackup]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Log CloudKit backup records" - actionBlock:^{ - [DebugUIBackup logBackupRecords]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Log CloudKit backup manifests" - actionBlock:^{ - [DebugUIBackup logBackupManifests]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Restore CloudKit backup" - actionBlock:^{ - [DebugUIBackup tryToImportBackup]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Log Database Size Stats" - actionBlock:^{ - [DebugUIBackup logDatabaseSizeStats]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Clear All CloudKit Records" - actionBlock:^{ - [DebugUIBackup clearAllCloudKitRecords]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Clear Backup Metadata Cache" - actionBlock:^{ - [DebugUIBackup clearBackupMetadataCache]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Log Backup Metadata Cache" - actionBlock:^{ - [DebugUIBackup logBackupMetadataCache]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Lazy Restore Attachments" - actionBlock:^{ - [AppEnvironment.shared.backupLazyRestore runIfNecessary]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Upload 100 CK records" - actionBlock:^{ - [DebugUIBackup uploadCKBatch:100]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Upload 1,000 CK records" - actionBlock:^{ - [DebugUIBackup uploadCKBatch:1000]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Upload 10,000 CK records" - actionBlock:^{ - [DebugUIBackup uploadCKBatch:10000]; - }]]; - - return [OWSTableSection sectionWithTitle:self.name items:items]; -} - -+ (void)backupTestFile -{ - OWSLogInfo(@"backupTestFile."); - - NSData *_Nullable data = [Randomness generateRandomBytes:32]; - OWSAssertDebug(data); - NSString *filePath = [OWSFileSystem temporaryFilePathWithFileExtension:@"pdf"]; - BOOL success = [data writeToFile:filePath atomically:YES]; - OWSAssertDebug(success); - - NSString *recipientId = self.tsAccountManager.localNumber; - NSString *recordName = [OWSBackupAPI recordNameForTestFileWithRecipientId:recipientId]; - CKRecord *record = [OWSBackupAPI recordForFileUrl:[NSURL fileURLWithPath:filePath] recordName:recordName]; - - [[self.backup ensureCloudKitAccess].thenInBackground(^{ - return [OWSBackupAPI saveRecordsToCloudObjcWithRecords:@[ record ]]; - }) retainUntilComplete]; -} - -+ (void)checkForBackup -{ - OWSLogInfo(@"checkForBackup."); - - [OWSBackup.sharedManager - checkCanImportBackup:^(BOOL value) { - OWSLogInfo(@"has backup available for import? %d", value); - } - failure:^(NSError *error){ - // Do nothing. - }]; -} - -+ (void)logBackupRecords -{ - OWSLogInfo(@"logBackupRecords."); - - [OWSBackup.sharedManager logBackupRecords]; -} - -+ (void)logBackupManifests -{ - OWSLogInfo(@"logBackupManifests."); - - [OWSBackup.sharedManager - allRecipientIdsWithManifestsInCloud:^(NSArray *recipientIds) { - OWSLogInfo(@"recipientIds: %@", recipientIds); - } - failure:^(NSError *error) { - OWSLogError(@"error: %@", error); - }]; -} - -+ (void)tryToImportBackup -{ - OWSLogInfo(@"tryToImportBackup."); - - UIAlertController *alert = - [UIAlertController alertControllerWithTitle:@"Restore CloudKit Backup" - message:@"This will delete all of your database contents." - preferredStyle:UIAlertControllerStyleAlert]; - - [alert addAction:[UIAlertAction actionWithTitle:@"Restore" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *_Nonnull action) { - [OWSBackup.sharedManager tryToImportBackup]; - }]]; - [alert addAction:[OWSAlerts cancelAction]]; - UIViewController *fromViewController = [[UIApplication sharedApplication] frontmostViewController]; - [fromViewController presentAlert:alert]; -} - -+ (void)logDatabaseSizeStats -{ - OWSLogInfo(@"logDatabaseSizeStats."); - - __block unsigned long long interactionCount = 0; - __block unsigned long long interactionSizeTotal = 0; - __block unsigned long long attachmentCount = 0; - __block unsigned long long attachmentSizeTotal = 0; - [[OWSPrimaryStorage.sharedManager newDatabaseConnection] readWithBlock:^(YapDatabaseReadTransaction *transaction) { - [transaction enumerateKeysAndObjectsInCollection:[TSInteraction collection] - usingBlock:^(NSString *key, id object, BOOL *stop) { - TSInteraction *interaction = object; - interactionCount++; - NSData *_Nullable data = - [NSKeyedArchiver archivedDataWithRootObject:interaction]; - OWSAssertDebug(data); - ows_add_overflow( - interactionSizeTotal, data.length, &interactionSizeTotal); - }]; - [transaction enumerateKeysAndObjectsInCollection:[TSAttachment collection] - usingBlock:^(NSString *key, id object, BOOL *stop) { - TSAttachment *attachment = object; - attachmentCount++; - NSData *_Nullable data = - [NSKeyedArchiver archivedDataWithRootObject:attachment]; - OWSAssertDebug(data); - ows_add_overflow( - attachmentSizeTotal, data.length, &attachmentSizeTotal); - }]; - }]; - - OWSLogInfo(@"interactionCount: %llu", interactionCount); - OWSLogInfo(@"interactionSizeTotal: %llu", interactionSizeTotal); - if (interactionCount > 0) { - OWSLogInfo(@"interaction average size: %f", interactionSizeTotal / (double)interactionCount); - } - OWSLogInfo(@"attachmentCount: %llu", attachmentCount); - OWSLogInfo(@"attachmentSizeTotal: %llu", attachmentSizeTotal); - if (attachmentCount > 0) { - OWSLogInfo(@"attachment average size: %f", attachmentSizeTotal / (double)attachmentCount); - } -} - -+ (void)clearAllCloudKitRecords -{ - OWSLogInfo(@""); - - [OWSBackup.sharedManager clearAllCloudKitRecords]; -} - -+ (void)clearBackupMetadataCache -{ - OWSLogInfo(@""); - - [OWSPrimaryStorage.sharedManager.newDatabaseConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [transaction removeAllObjectsInCollection:[OWSBackupFragment collection]]; - }]; -} - -+ (void)logBackupMetadataCache -{ - [self.backup logBackupMetadataCache:OWSPrimaryStorage.sharedManager.newDatabaseConnection]; -} - -+ (void)uploadCKBatch:(NSUInteger)count -{ - NSMutableArray *records = [NSMutableArray new]; - for (NSUInteger i = 0; i < count; i++) { - NSData *_Nullable data = [Randomness generateRandomBytes:32]; - OWSAssertDebug(data); - NSString *filePath = [OWSFileSystem temporaryFilePathWithFileExtension:@"pdf"]; - BOOL success = [data writeToFile:filePath atomically:YES]; - OWSAssertDebug(success); - - NSString *recipientId = self.tsAccountManager.localNumber; - NSString *recordName = [OWSBackupAPI recordNameForTestFileWithRecipientId:recipientId]; - CKRecord *record = [OWSBackupAPI recordForFileUrl:[NSURL fileURLWithPath:filePath] recordName:recordName]; - [records addObject:record]; - } - [[OWSBackupAPI saveRecordsToCloudObjcWithRecords:records].thenInBackground(^{ - OWSLogVerbose(@"success."); - }) retainUntilComplete]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUICalling.swift b/Session/src/ViewControllers/DebugUI/DebugUICalling.swift deleted file mode 100644 index 4ae460b87..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUICalling.swift +++ /dev/null @@ -1,75 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -import Foundation -import SignalUtilitiesKit -import SignalUtilitiesKit - -class DebugUICalling: DebugUIPage { - - // MARK: Dependencies - - var messageSender: MessageSender { - return SSKEnvironment.shared.messageSender - } - - // MARK: Overrides - - override func name() -> String { - return "Calling" - } - - override func section(thread aThread: TSThread?) -> OWSTableSection? { - guard let thread = aThread as? TSContactThread else { - owsFailDebug("Calling is only valid for contact thread, got thread: \(String(describing: aThread))") - return nil - } - - let sectionItems = [ - OWSTableItem(title: "Send 'hangup' for old call") { [weak self] in - guard let strongSelf = self else { return } - - let kFakeCallId = UInt64(12345) - var hangupMessage: SSKProtoCallMessageHangup - do { - let hangupBuilder = SSKProtoCallMessageHangup.builder(id: kFakeCallId) - hangupMessage = try hangupBuilder.build() - } catch { - owsFailDebug("could not build proto") - return - } - let callMessage = OWSOutgoingCallMessage(thread: thread, hangupMessage: hangupMessage) - - strongSelf.messageSender.sendPromise(message: callMessage).done { - Logger.debug("Successfully sent hangup call message to \(thread.contactIdentifier())") - }.catch { error in - Logger.error("failed to send hangup call message to \(thread.contactIdentifier()) with error: \(error)") - }.retainUntilComplete() - }, - OWSTableItem(title: "Send 'busy' for old call") { [weak self] in - guard let strongSelf = self else { return } - - let kFakeCallId = UInt64(12345) - var busyMessage: SSKProtoCallMessageBusy - do { - let busyBuilder = SSKProtoCallMessageBusy.builder(id: kFakeCallId) - busyMessage = try busyBuilder.build() - } catch { - owsFailDebug("Couldn't build proto") - return - } - - let callMessage = OWSOutgoingCallMessage(thread: thread, busyMessage: busyMessage) - - strongSelf.messageSender.sendPromise(message: callMessage).done { - Logger.debug("Successfully sent busy call message to \(thread.contactIdentifier())") - }.catch { error in - Logger.error("failed to send busy call message to \(thread.contactIdentifier()) with error: \(error)") - }.retainUntilComplete() - } - ] - - return OWSTableSection(title: "Call Debug", items: sectionItems) - } -} diff --git a/Session/src/ViewControllers/DebugUI/DebugUIContacts.h b/Session/src/ViewControllers/DebugUI/DebugUIContacts.h deleted file mode 100644 index 1a2866816..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIContacts.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIPage.h" - -NS_ASSUME_NONNULL_BEGIN - -@class CNContact; -@class OWSTableSection; - -@interface DebugUIContacts : DebugUIPage - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIContacts.m b/Session/src/ViewControllers/DebugUI/DebugUIContacts.m deleted file mode 100644 index d4d14044d..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIContacts.m +++ /dev/null @@ -1,120 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIContacts.h" -#import "DebugContactsUtils.h" -#import "OWSTableViewController.h" -#import "Session-Swift.h" -#import "SignalApp.h" -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@implementation DebugUIContacts - -#pragma mark - Factory Methods - -- (NSString *)name -{ - return @"Contacts"; -} - -- (nullable OWSTableSection *)sectionForThread:(nullable TSThread *)thread -{ - return [OWSTableSection sectionWithTitle:self.name - items:@[ - [OWSTableItem itemWithTitle:@"Create 1 Random Contact" - actionBlock:^{ - [DebugContactsUtils createRandomContacts:1]; - }], - [OWSTableItem itemWithTitle:@"Create 100 Random Contacts" - actionBlock:^{ - [DebugContactsUtils createRandomContacts:100]; - }], - [OWSTableItem itemWithTitle:@"Create 1k Random Contacts" - actionBlock:^{ - [DebugContactsUtils createRandomContacts:1000]; - }], - [OWSTableItem itemWithTitle:@"Create 10k Random Contacts" - actionBlock:^{ - [DebugContactsUtils createRandomContacts:10 * 1000]; - }], - [OWSTableItem itemWithTitle:@"Delete Random Contacts" - actionBlock:^{ - [DebugContactsUtils deleteAllRandomContacts]; - }], - [OWSTableItem itemWithTitle:@"Delete All Contacts" - actionBlock:^{ - [DebugContactsUtils deleteAllContacts]; - }], - [OWSTableItem itemWithTitle:@"Clear SignalAccount Cache" - actionBlock:^{ - [DebugUIContacts clearSignalAccountCache]; - }], - [OWSTableItem itemWithTitle:@"Clear SignalRecipient Cache" - actionBlock:^{ - [DebugUIContacts clearSignalRecipientCache]; - }], - [OWSTableItem itemWithTitle:@"New Unregistered Contact Thread" - actionBlock:^{ - [DebugUIContacts createUnregisteredContactThread]; - }], - [OWSTableItem itemWithTitle:@"New Unregistered Group Thread" - actionBlock:^{ - [DebugUIContacts createUnregisteredGroupThread]; - }], - ]]; -} - -+ (void)clearSignalAccountCache -{ - OWSLogWarn(@"Deleting all signal accounts."); - [SignalAccount removeAllObjectsInCollection]; -} - -+ (void)clearSignalRecipientCache -{ - OWSLogWarn(@"Deleting all signal recipients."); - [SignalRecipient removeAllObjectsInCollection]; -} - -+ (NSString *)unregisteredRecipientId -{ - // We ensure that the phone number is invalid by appending too many digits. - NSMutableString *recipientId = [@"+1" mutableCopy]; - for (int i = 0; i < 11; i++) { - [recipientId appendFormat:@"%d", (int)(arc4random() % 10)]; - } - return [recipientId copy]; -} - -+ (void)createUnregisteredContactThread -{ - NSString *recipientId = [self unregisteredRecipientId]; - TSContactThread *thread = [TSContactThread getOrCreateThreadWithContactId:recipientId]; - [SignalApp.sharedApp presentConversationForThread:thread animated:YES]; -} - -+ (void)createUnregisteredGroupThread -{ - NSString *unregisteredRecipientId = [self unregisteredRecipientId]; - NSString *validRecipientId = @"+19174054216"; - - NSString *groupName = @"Partially invalid group"; - NSMutableArray *recipientIds = [@[ - unregisteredRecipientId, - validRecipientId, - TSAccountManager.localNumber, - ] mutableCopy]; - NSData *groupId = [Randomness generateRandomBytes:16]; - TSGroupModel *model = [[TSGroupModel alloc] initWithTitle:groupName memberIds:recipientIds image:nil groupId:groupId groupType:closedGroup adminIds:@[ TSAccountManager.localNumber ]]; - TSGroupThread *thread = [TSGroupThread getOrCreateThreadWithGroupModel:model]; - - [SignalApp.sharedApp presentConversationForThread:thread animated:YES]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIDiskUsage.h b/Session/src/ViewControllers/DebugUI/DebugUIDiskUsage.h deleted file mode 100644 index 5cb1c5ff3..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIDiskUsage.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIPage.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DebugUIDiskUsage : DebugUIPage - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIDiskUsage.m b/Session/src/ViewControllers/DebugUI/DebugUIDiskUsage.m deleted file mode 100644 index a6dd47c8d..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIDiskUsage.m +++ /dev/null @@ -1,116 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIDiskUsage.h" -#import "OWSOrphanDataCleaner.h" -#import "OWSTableViewController.h" -#import "Session-Swift.h" -#import -#import -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@implementation DebugUIDiskUsage - -#pragma mark - Factory Methods - -- (NSString *)name -{ - return @"Orphans & Disk Usage"; -} - -- (nullable OWSTableSection *)sectionForThread:(nullable TSThread *)thread -{ - return [OWSTableSection sectionWithTitle:self.name - items:@[ - [OWSTableItem itemWithTitle:@"Audit & Log" - actionBlock:^{ - [OWSOrphanDataCleaner auditAndCleanup:NO]; - }], - [OWSTableItem itemWithTitle:@"Audit & Clean Up" - actionBlock:^{ - [OWSOrphanDataCleaner auditAndCleanup:YES]; - }], - [OWSTableItem itemWithTitle:@"Save All Attachments" - actionBlock:^{ - [DebugUIDiskUsage saveAllAttachments]; - }], - [OWSTableItem itemWithTitle:@"Delete Messages older than 3 Months" - actionBlock:^{ - [DebugUIDiskUsage deleteOldMessages_3Months]; - }], - ]]; -} - -+ (void)saveAllAttachments -{ - OWSPrimaryStorage *primaryStorage = [OWSPrimaryStorage sharedManager]; - [primaryStorage.newDatabaseConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { - NSMutableArray *attachmentStreams = [NSMutableArray new]; - [transaction enumerateKeysAndObjectsInCollection:TSAttachmentStream.collection - usingBlock:^(NSString *key, TSAttachment *attachment, BOOL *stop) { - if (![attachment isKindOfClass:[TSAttachmentStream class]]) { - return; - } - TSAttachmentStream *attachmentStream - = (TSAttachmentStream *)attachment; - [attachmentStreams addObject:attachmentStream]; - }]; - - OWSLogInfo(@"Saving %zd attachment streams.", attachmentStreams.count); - - // Persist the new localRelativeFilePath property of TSAttachmentStream. - // For performance, we want to upgrade all existing attachment streams in - // a single transaction. - for (TSAttachmentStream *attachmentStream in attachmentStreams) { - [attachmentStream saveWithTransaction:transaction]; - } - }]; -} - -+ (void)deleteOldMessages_3Months -{ - [self deleteOldMessages:kMonthInterval * 3]; -} - -+ (void)deleteOldMessages:(NSTimeInterval)maxAgeSeconds -{ - OWSPrimaryStorage *primaryStorage = [OWSPrimaryStorage sharedManager]; - [primaryStorage.newDatabaseConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { - NSMutableArray *threadIds = [NSMutableArray new]; - YapDatabaseViewTransaction *interactionsByThread = [transaction ext:TSMessageDatabaseViewExtensionName]; - [interactionsByThread enumerateGroupsUsingBlock:^(NSString *group, BOOL *stop) { - [threadIds addObject:group]; - }]; - NSMutableArray *interactionsToDelete = [NSMutableArray new]; - for (NSString *threadId in threadIds) { - [interactionsByThread enumerateKeysAndObjectsInGroup:threadId - usingBlock:^(NSString *collection, - NSString *key, - TSInteraction *interaction, - NSUInteger index, - BOOL *stop) { - NSTimeInterval ageSeconds - = fabs(interaction.receivedAtDate.timeIntervalSinceNow); - if (ageSeconds < maxAgeSeconds) { - *stop = YES; - return; - } - [interactionsToDelete addObject:interaction]; - }]; - } - - OWSLogInfo(@"Deleting %zd interactions.", interactionsToDelete.count); - - for (TSInteraction *interaction in interactionsToDelete) { - [interaction removeWithTransaction:transaction]; - } - }]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIFileBrowser.swift b/Session/src/ViewControllers/DebugUI/DebugUIFileBrowser.swift deleted file mode 100644 index 7a20e1065..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIFileBrowser.swift +++ /dev/null @@ -1,378 +0,0 @@ -// -// Copyright (c) 2019 Open Whisper Systems. All rights reserved. -// - -@objc class DebugUIFileBrowser: OWSTableViewController { - - // MARK: Dependencies - var fileManager: FileManager { - return FileManager.default - } - - // MARK: Overrides - let fileURL: URL - - @objc init(fileURL: URL) { - self.fileURL = fileURL - - super.init() - - self.contents = buildContents() - } - - required init?(coder aDecoder: NSCoder) { - notImplemented() - } - - override func viewDidLoad() { - super.viewDidLoad() - let titleLabel = UILabel() - titleLabel.text = "\(fileURL)" - titleLabel.sizeToFit() - titleLabel.textColor = Theme.primaryColor - titleLabel.lineBreakMode = .byTruncatingHead - self.navigationItem.titleView = titleLabel - } - - fileprivate func updateContents() { - self.contents = buildContents() - self.tableView.reloadData() - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - // In case files were added / removed in child view controller - updateContents() - } - - func buildContents() -> OWSTableContents { - let contents = OWSTableContents() - - let isDirectoryPtr: UnsafeMutablePointer = UnsafeMutablePointer.allocate(capacity: 1) - guard fileManager.fileExists(atPath: fileURL.path, isDirectory: isDirectoryPtr) else { - contents.title = "File not found: \(fileURL)" - return contents - } - - let isDirectory: Bool = isDirectoryPtr.pointee.boolValue - - if isDirectory { - var fileItems: [OWSTableItem] = [] - let resourceKeys: [URLResourceKey] = [.isDirectoryKey] - - let directoryContents: [URL] = { - do { - return try fileManager.contentsOfDirectory(at: fileURL, - includingPropertiesForKeys: resourceKeys) - } catch { - owsFailDebug("contentsOfDirectory(\(fileURL) failed with error: \(error)") - return [] - } - }() - - fileItems = directoryContents.map { fileInDirectory in - let fileIcon: String = { - do { - guard let isDirectory = try fileInDirectory.resourceValues(forKeys: Set(resourceKeys)).isDirectory else { - owsFailDebug("unable to check isDirectory for file: \(fileInDirectory)") - return "" - } - - return isDirectory ? "📁 " : "" - } catch { - owsFailDebug("failed to check isDirectory for file: \(fileInDirectory) with error: \(error)") - return "" - } - }() - - let labelText = "\(fileIcon)\(fileInDirectory.lastPathComponent)" - - return OWSTableItem.disclosureItem(withText: labelText) { [weak self] in - let subBrowser = DebugUIFileBrowser(fileURL: fileInDirectory) - self?.navigationController?.pushViewController(subBrowser, animated: true) - } - } - - let filesSection = OWSTableSection(title: "Dir with \(fileItems.count) files", items: fileItems) - contents.addSection(filesSection) - } // end `if isDirectory` - - let attributeItems: [OWSTableItem] = { - do { - let attributes: [FileAttributeKey: Any] = try fileManager.attributesOfItem(atPath: fileURL.path) - return attributes.map { (fileAttribute: FileAttributeKey, value: Any) in - let title = fileAttribute.rawValue.replacingOccurrences(of: "NSFile", with: "") - return OWSTableItem(title: "\(title): \(value)") { - OWSAlerts.showAlert(title: title, message: "\(value)") - } - } - } catch { - owsFailDebug("failed getting attributes for file at path: \(fileURL)") - return [] - } - }() - let attributesSection = OWSTableSection(title: "Attributes", items: attributeItems) - contents.addSection(attributesSection) - - var managementItems = [ - OWSTableItem.disclosureItem(withText: "✎ Rename") { [weak self] in - guard let strongSelf = self else { - return - } - - let alert = UIAlertController(title: "Rename File", - message: "Will be created in \(strongSelf.fileURL.lastPathComponent)", - preferredStyle: .alert) - - alert.addAction(OWSAlerts.cancelAction) - alert.addAction(UIAlertAction(title: "Rename \(strongSelf.fileURL.lastPathComponent)", style: .default) { _ in - guard let textField = alert.textFields?.first else { - owsFailDebug("missing text field") - return - } - - guard let inputString = textField.text, inputString.count >= 4 else { - OWSAlerts.showAlert(title: "new file name missing or less than 4 chars") - return - } - - let newURL = strongSelf.fileURL.deletingLastPathComponent().appendingPathComponent(inputString) - - do { - try strongSelf.fileManager.moveItem(at: strongSelf.fileURL, to: newURL) - - Logger.debug("\(strongSelf) moved \(strongSelf.fileURL) -> \(newURL)") - strongSelf.navigationController?.popViewController(animated: true) - } catch { - owsFailDebug("\(strongSelf) failed to move \(strongSelf.fileURL) -> \(newURL) with error: \(error)") - } - }) - - alert.addTextField { textField in - textField.placeholder = "New Name" - textField.text = strongSelf.fileURL.lastPathComponent - } - - strongSelf.presentAlert(alert) - }, - - OWSTableItem.disclosureItem(withText: "➡ Move") { [weak self] in - guard let strongSelf = self else { - return - } - - let fileURL: URL = strongSelf.fileURL - let filename: String = fileURL.lastPathComponent - let oldDirectory: URL = fileURL.deletingLastPathComponent() - - let alert = UIAlertController(title: "Moving File: \(filename)", - message: "Currently in: \(oldDirectory)", - preferredStyle: .alert) - - alert.addAction(OWSAlerts.cancelAction) - alert.addAction(UIAlertAction(title: "Moving \(filename)", style: .default) { _ in - guard let textField = alert.textFields?.first else { - owsFailDebug("missing text field") - return - } - - guard let inputString = textField.text, inputString.count >= 4 else { - OWSAlerts.showAlert(title: "new file dir missing or less than 4 chars") - return - } - - let newURL = URL(fileURLWithPath: inputString).appendingPathComponent(filename) - - do { - try strongSelf.fileManager.moveItem(at: fileURL, to: newURL) - - Logger.debug("\(strongSelf) moved \(fileURL) -> \(newURL)") - strongSelf.navigationController?.popViewController(animated: true) - } catch { - owsFailDebug("\(strongSelf) failed to move \(fileURL) -> \(newURL) with error: \(error)") - } - }) - - alert.addTextField { textField in - textField.placeholder = "New Directory" - textField.text = oldDirectory.path - } - - strongSelf.presentAlert(alert) - }, - - OWSTableItem.disclosureItem(withText: "❌ Delete") { [weak self] in - guard let strongSelf = self else { - return - } - - OWSAlerts.showConfirmationAlert(title: "Delete \(strongSelf.fileURL.path)?") { _ in - Logger.debug("deleting file at \(strongSelf.fileURL.path)") - do { - try strongSelf.fileManager.removeItem(atPath: strongSelf.fileURL.path) - strongSelf.navigationController?.popViewController(animated: true) - } catch { - owsFailDebug("failed to remove item: \(strongSelf.fileURL) with error: \(error)") - } - } - }, - - OWSTableItem.disclosureItem(withText: "📋 Copy Path to Clipboard") { [weak self] in - guard let strongSelf = self else { - return - } - - UIPasteboard.general.string = strongSelf.fileURL.path - - let alert = UIAlertController(title: "Path Copied to Clipboard!", - message: "\(strongSelf.fileURL.path)", - preferredStyle: .alert) - alert.addAction(UIAlertAction(title: "Copy Filename Instead", style: .default) { _ in - UIPasteboard.general.string = strongSelf.fileURL.lastPathComponent - }) - - alert.addAction(UIAlertAction(title: "Dismiss", style: .default)) - - strongSelf.presentAlert(alert) - }, - - OWSTableItem.disclosureItem(withText: "🔒 Set File Protection") { [weak self] in - guard let strongSelf = self else { - return - } - - let fileURL = strongSelf.fileURL - - let currentFileProtection: FileProtectionType? = { - do { - let attributes = try strongSelf.fileManager.attributesOfItem(atPath: fileURL.path) - return attributes[FileAttributeKey.protectionKey] as? FileProtectionType - } catch { - owsFailDebug("failed to get current file protection for file: \(fileURL)") - return nil - } - }() - - let actionSheet = UIAlertController(title: "Set file protection level", - message: "Currently: \(currentFileProtection?.rawValue ?? "Unknown")", - preferredStyle: .actionSheet) - - let protections: [FileProtectionType] = [.none, .complete, .completeUnlessOpen, .completeUntilFirstUserAuthentication] - protections.forEach { (protection: FileProtectionType) in - actionSheet.addAction(UIAlertAction(title: "\(protection.rawValue.replacingOccurrences(of: "NSFile", with: ""))", style: .default) { (_: UIAlertAction) in - Logger.debug("chose protection: \(protection) for file: \(fileURL)") - let fileAttributes: [FileAttributeKey: Any] = [.protectionKey: protection] - do { - try strongSelf.fileManager.setAttributes(fileAttributes, ofItemAtPath: strongSelf.fileURL.path) - Logger.debug("updated file protection at path:\(fileURL.path) to: \(protection.rawValue)") - strongSelf.updateContents() - } catch { - owsFailDebug("failed to update file protection at path:\(fileURL.path) with error: \(error)") - } - }) - } - actionSheet.addAction(OWSAlerts.cancelAction) - - strongSelf.presentAlert(actionSheet) - } - ] - - if isDirectory { - let createFileItem = OWSTableItem.disclosureItem(withText: "📝 Create File in this Dir") { [weak self] in - guard let strongSelf = self else { - return - } - - let alert = UIAlertController(title: "Name of file", - message: "Will be created in \(strongSelf.fileURL.lastPathComponent)", - preferredStyle: .alert) - - alert.addAction(OWSAlerts.cancelAction) - alert.addAction(UIAlertAction(title: "Create", style: .default) { _ in - guard let textField = alert.textFields?.first else { - owsFailDebug("missing text field") - return - } - - guard let inputString = textField.text, inputString.count >= 4 else { - OWSAlerts.showAlert(title: "file name missing or less than 4 chars") - return - } - - let newPath = strongSelf.fileURL.appendingPathComponent(inputString).path - - Logger.debug("creating file at \(newPath)") - strongSelf.fileManager.createFile(atPath: newPath, contents: nil) - - strongSelf.updateContents() - }) - - alert.addTextField { textField in - textField.placeholder = "File Name" - } - - strongSelf.presentAlert(alert) - } - - managementItems.append(createFileItem) - - let createDirItem = OWSTableItem.disclosureItem(withText: "📁 Create Dir in this Dir") { [weak self] in - guard let strongSelf = self else { - return - } - - let alert = UIAlertController(title: "Name of Dir", - message: "Will be created in \(strongSelf.fileURL.lastPathComponent)", - preferredStyle: .alert) - - alert.addAction(OWSAlerts.cancelAction) - alert.addAction(UIAlertAction(title: "Create", style: .default) { _ in - guard let textField = alert.textFields?.first else { - owsFailDebug("missing text field") - return - } - - guard let inputString = textField.text, inputString.count >= 4 else { - OWSAlerts.showAlert(title: "dir name missing or less than 4 chars") - return - } - - let newPath = strongSelf.fileURL.appendingPathComponent(inputString).path - - Logger.debug("creating dir at \(newPath)") - do { - try strongSelf.fileManager.createDirectory(atPath: newPath, withIntermediateDirectories: false) - strongSelf.updateContents() - } catch { - owsFailDebug("Failed to create dir: \(newPath) with error: \(error)") - } - }) - - alert.addTextField { textField in - textField.placeholder = "Dir Name" - } - - strongSelf.presentAlert(alert) - } - managementItems.append(createDirItem) - - } else { // if not directory - - let shareItem = OWSTableItem.disclosureItem(withText: "📩 Share") { [weak self] in - guard let strongSelf = self else { - return - } - - AttachmentSharing.showShareUI(for: strongSelf.fileURL) - } - managementItems.append(shareItem) - } - - let fileType = isDirectory ? "Dir" : "File" - let filesSection = OWSTableSection(title: "\(fileType): \(fileURL.lastPathComponent)", items: managementItems) - contents.addSection(filesSection) - - contents.title = "\(fileType): \(fileURL)" - return contents - } -} diff --git a/Session/src/ViewControllers/DebugUI/DebugUIMessages.h b/Session/src/ViewControllers/DebugUI/DebugUIMessages.h deleted file mode 100644 index 4ff187f13..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIMessages.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIPage.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DebugUIMessages : DebugUIPage - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIMessages.m b/Session/src/ViewControllers/DebugUI/DebugUIMessages.m deleted file mode 100644 index aec519062..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIMessages.m +++ /dev/null @@ -1,4863 +0,0 @@ -// -// Copyright (c) 2019 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIMessages.h" -#import "DebugContactsUtils.h" -#import "DebugUIContacts.h" -#import "DebugUIMessagesAction.h" -#import "DebugUIMessagesAssetLoader.h" -#import "OWSTableViewController.h" -#import "Session-Swift.h" -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface TSIncomingMessage (DebugUI) - -@property (nonatomic, getter=wasRead) BOOL read; - -@end - -#pragma mark - - -@interface TSOutgoingMessage (PostDatingDebug) - -- (void)setReceivedAtTimestamp:(uint64_t)value; - -@end - -#pragma mark - - -@implementation DebugUIMessages - -#pragma mark - Factory Methods - -- (NSString *)name -{ - return @"Messages"; -} - -#ifdef DEBUG - -- (NSArray *)itemsForActions:(NSArray *)actions -{ - NSMutableArray *items = [NSMutableArray new]; - - for (DebugUIMessagesAction *action in actions) { - [items addObject:[OWSTableItem itemWithTitle:action.label - actionBlock:^{ - // For "all in group" actions, do each subaction in the group - // exactly once, in a predictable order. - if ([action isKindOfClass:[DebugUIMessagesGroupAction class]]) { - DebugUIMessagesGroupAction *groupAction - = (DebugUIMessagesGroupAction *)action; - if (groupAction.subactionMode == SubactionMode_Ordered) { - [action prepareAndPerformNTimes:groupAction.subactions.count]; - return; - } - } - [DebugUIMessages performActionNTimes:action]; - }]]; - } - - return items; -} - -#endif - -- (nullable OWSTableSection *)sectionForThread:(nullable TSThread *)thread -{ - OWSAssertDebug(thread); - - NSMutableArray *items = [NSMutableArray new]; - -#ifdef DEBUG - - [items addObject:[OWSTableItem itemWithTitle:@"Delete all messages in thread" - actionBlock:^{ - [DebugUIMessages deleteAllMessagesInThread:thread]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"👷 Thrash insert/deletes" - actionBlock:^{ - [DebugUIMessages thrashInsertAndDeleteForThread:(TSThread *)thread - counter:300]; - }]]; - - [items addObjectsFromArray:[self itemsForActions:@[ - [DebugUIMessages fakeAllContactShareAction:thread], - [DebugUIMessages sendMessageVariationsAction:thread], - // Send Media - [DebugUIMessages sendAllMediaAction:thread], - [DebugUIMessages sendRandomMediaAction:thread], - // Fake Media - [DebugUIMessages fakeAllMediaAction:thread], - [DebugUIMessages fakeRandomMediaAction:thread], - // Fake Text - [DebugUIMessages fakeAllTextAction:thread], - [DebugUIMessages fakeRandomTextAction:thread], - // Sequences - [DebugUIMessages allFakeSequencesAction:thread], - // Quoted Replies - [DebugUIMessages allQuotedReplyAction:thread], - // Exemplary - [DebugUIMessages allFakeAction:thread], - [DebugUIMessages allFakeBackDatedAction:thread], - ]]]; - - [items addObjectsFromArray:@[ - -#pragma mark - Actions - - [OWSTableItem itemWithTitle:@"Send N text messages (1/sec.)" - actionBlock:^{ - [DebugUIMessages sendNTextMessagesInThread:thread]; - }], - [OWSTableItem itemWithTitle:@"Send Media Gallery" - actionBlock:^{ - [DebugUIMessages sendMediaAlbumInThread:thread]; - }], - [OWSTableItem itemWithTitle:@"Send Exemplary Media Galleries" - actionBlock:^{ - [DebugUIMessages sendExemplaryMediaGalleriesInThread:thread]; - }], - [OWSTableItem itemWithTitle:@"Select Fake" - actionBlock:^{ - [DebugUIMessages selectFakeAction:thread]; - }], - [OWSTableItem itemWithTitle:@"Select Send Media" - actionBlock:^{ - [DebugUIMessages selectSendMediaAction:thread]; - }], - [OWSTableItem itemWithTitle:@"Send All Contact Shares" - actionBlock:^{ - [DebugUIMessages sendAllContacts:thread]; - }], - [OWSTableItem itemWithTitle:@"Select Quoted Reply" - actionBlock:^{ - [DebugUIMessages selectQuotedReplyAction:thread]; - }], - [OWSTableItem itemWithTitle:@"Select Back-Dated" - actionBlock:^{ - [DebugUIMessages selectBackDatedAction:thread]; - }], - - -#pragma mark - Misc. - - [OWSTableItem itemWithTitle:@"Perform 100 random actions" - actionBlock:^{ - [DebugUIMessages performRandomActions:100 thread:thread]; - }], - [OWSTableItem itemWithTitle:@"Perform 1,000 random actions" - actionBlock:^{ - [DebugUIMessages performRandomActions:1000 thread:thread]; - }], - [OWSTableItem itemWithTitle:@"Create 10 fake messages" - actionBlock:^{ - [DebugUIMessages sendFakeMessages:10 thread:thread]; - }], - [OWSTableItem itemWithTitle:@"Create 1 fake thread with 1 message" - actionBlock:^{ - [DebugUIMessages createFakeThreads:1 withFakeMessages:1]; - }], - [OWSTableItem itemWithTitle:@"Create 100 fake threads with 10 messages" - actionBlock:^{ - [DebugUIMessages createFakeThreads:100 withFakeMessages:10]; - }], - [OWSTableItem itemWithTitle:@"Create 10 fake threads with 100 messages" - actionBlock:^{ - [DebugUIMessages createFakeThreads:10 withFakeMessages:100]; - }], - [OWSTableItem itemWithTitle:@"Create 10 fake threads with 10 messages" - actionBlock:^{ - [DebugUIMessages createFakeThreads:10 withFakeMessages:10]; - }], - [OWSTableItem itemWithTitle:@"Create 100 fake threads with 100 messages" - actionBlock:^{ - [DebugUIMessages createFakeThreads:100 withFakeMessages:100]; - }], - [OWSTableItem itemWithTitle:@"Create 1k fake threads with 1 message" - actionBlock:^{ - [DebugUIMessages createFakeThreads:1000 withFakeMessages:1]; - }], - [OWSTableItem itemWithTitle:@"Create 1k fake messages" - actionBlock:^{ - [DebugUIMessages sendFakeMessages:1000 thread:thread]; - }], - [OWSTableItem itemWithTitle:@"Create 10k fake messages" - actionBlock:^{ - [DebugUIMessages sendFakeMessages:10 * 1000 thread:thread]; - }], - [OWSTableItem itemWithTitle:@"Create 10k fake text messages" - actionBlock:^{ - [DebugUIMessages sendFakeMessages:10 * 1000 thread:thread isTextOnly:YES]; - }], - [OWSTableItem itemWithTitle:@"Create 100k fake messages" - actionBlock:^{ - [DebugUIMessages sendFakeMessages:100 * 1000 thread:thread]; - }], - [OWSTableItem itemWithTitle:@"Create 100k fake text messages" - actionBlock:^{ - [DebugUIMessages sendFakeMessages:100 * 1000 thread:thread isTextOnly:YES]; - }], - [OWSTableItem itemWithTitle:@"Send text/x-signal-plain" - actionBlock:^{ - [DebugUIMessages sendOversizeTextMessage:thread]; - }], - [OWSTableItem itemWithTitle:@"Send unknown mimetype" - actionBlock:^{ - [DebugUIMessages sendRandomAttachment:thread uti:kUnknownTestAttachmentUTI]; - }], - [OWSTableItem itemWithTitle:@"Send pdf" - actionBlock:^{ - [DebugUIMessages sendRandomAttachment:thread uti:(NSString *)kUTTypePDF]; - }], - [OWSTableItem itemWithTitle:@"Create all system messages" - actionBlock:^{ - [DebugUIMessages createSystemMessagesInThread:thread]; - }], - [OWSTableItem itemWithTitle:@"Create messages with variety of timestamps" - actionBlock:^{ - [DebugUIMessages createTimestampMessagesInThread:thread]; - }], - - [OWSTableItem itemWithTitle:@"Send 10 text and system messages" - actionBlock:^{ - [DebugUIMessages sendTextAndSystemMessages:10 thread:thread]; - }], - [OWSTableItem itemWithTitle:@"Send 100 text and system messages" - actionBlock:^{ - [DebugUIMessages sendTextAndSystemMessages:100 thread:thread]; - }], - [OWSTableItem itemWithTitle:@"Send 1,000 text and system messages" - actionBlock:^{ - [DebugUIMessages sendTextAndSystemMessages:1000 thread:thread]; - }], - [OWSTableItem - itemWithTitle:@"Request Bogus group info" - actionBlock:^{ - OWSLogInfo(@"Requesting bogus group info for thread: %@", thread); - OWSSyncGroupsRequestMessage *syncGroupsRequestMessage = [[OWSSyncGroupsRequestMessage alloc] - initWithThread:thread - groupId:[Randomness generateRandomBytes:kGroupIdLength]]; - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { - [self.messageSenderJobQueue addMessage:syncGroupsRequestMessage transaction:transaction]; - }]; - }], - [OWSTableItem itemWithTitle:@"Message with stalled timer" - actionBlock:^{ - [DebugUIMessages createDisappearingMessagesWhichFailedToStartInThread:thread]; - }], - [OWSTableItem itemWithTitle:@"Inject 10 fake incoming messages" - actionBlock:^{ - [DebugUIMessages injectFakeIncomingMessages:10 thread:thread]; - }], - [OWSTableItem itemWithTitle:@"Inject 100 fake incoming messages" - actionBlock:^{ - [DebugUIMessages injectFakeIncomingMessages:100 thread:thread]; - }], - [OWSTableItem itemWithTitle:@"Inject 1,000 fake incoming messages" - actionBlock:^{ - [DebugUIMessages injectFakeIncomingMessages:1000 thread:thread]; - }], - [OWSTableItem itemWithTitle:@"Test Indic Scripts" - actionBlock:^{ - [DebugUIMessages testIndicScriptsInThread:thread]; - }], - [OWSTableItem itemWithTitle:@"Test Zalgo" - actionBlock:^{ - [DebugUIMessages testZalgoTextInThread:thread]; - }], - [OWSTableItem itemWithTitle:@"Test Directional Filenames" - actionBlock:^{ - [DebugUIMessages testDirectionalFilenamesInThread:thread]; - }], - [OWSTableItem itemWithTitle:@"Test Linkification" - actionBlock:^{ - [DebugUIMessages testLinkificationInThread:thread]; - }], - - ]]; - - if ([thread isKindOfClass:[TSContactThread class]]) { - TSContactThread *contactThread = (TSContactThread *)thread; - NSString *recipientId = contactThread.contactIdentifier; - [items addObject:[OWSTableItem itemWithTitle:@"Create 10 new groups" - actionBlock:^{ - [DebugUIMessages createNewGroups:10 recipientId:recipientId]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Create 100 new groups" - actionBlock:^{ - [DebugUIMessages createNewGroups:100 recipientId:recipientId]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Create 1,000 new groups" - actionBlock:^{ - [DebugUIMessages createNewGroups:1000 recipientId:recipientId]; - }]]; - } - if ([thread isKindOfClass:[TSGroupThread class]]) { - TSGroupThread *groupThread = (TSGroupThread *)thread; - [items addObject:[OWSTableItem itemWithTitle:@"Send message to all members" - actionBlock:^{ - [DebugUIMessages sendMessages:1 toAllMembersOfGroup:groupThread]; - }]]; - } - -#endif - - return [OWSTableSection sectionWithTitle:self.name items:items]; -} - -#ifdef DEBUG - -#pragma mark - Dependencies - -- (YapDatabaseConnection *)dbConnection -{ - return self.class.dbConnection; -} - -+ (YapDatabaseConnection *)dbConnection -{ - return SSKEnvironment.shared.primaryStorage.dbReadWriteConnection; -} - -+ (SSKMessageSenderJobQueue *)messageSenderJobQueue -{ - return SSKEnvironment.shared.messageSenderJobQueue; -} - -- (SSKMessageSenderJobQueue *)messageSenderJobQueue -{ - return self.class.messageSenderJobQueue; -} - -+ (void)sendMessages:(NSUInteger)count toAllMembersOfGroup:(TSGroupThread *)groupThread -{ - for (NSString *recipientId in groupThread.groupModel.groupMemberIds) { - TSContactThread *contactThread = [TSContactThread getOrCreateThreadWithContactId:recipientId]; - [[self sendTextMessagesActionInThread:contactThread] prepareAndPerformNTimes:count]; - } -} - -+ (void)sendTextMessageInThread:(TSThread *)thread counter:(NSUInteger)counter -{ - OWSLogInfo(@"sendTextMessageInThread: %zd", counter); - [DDLog flushLog]; - - NSString *randomText = [self randomText]; - NSString *text = [[[@(counter) description] stringByAppendingString:@" "] stringByAppendingString:randomText]; - __block TSOutgoingMessage *message; - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - message = [ThreadUtil enqueueMessageWithText:text - inThread:thread - quotedReplyModel:nil - linkPreviewDraft:nil - transaction:transaction]; - }]; - OWSLogError(@"sendTextMessageInThread timestamp: %llu.", message.timestamp); -} - -+ (void)sendNTextMessagesInThread:(TSThread *)thread -{ - [self performActionNTimes:[self sendTextMessagesActionInThread:thread]]; -} - -+ (DebugUIMessagesAction *)sendTextMessagesActionInThread:(TSThread *)thread -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesSingleAction actionWithLabel:@"Send Text Message" - staggeredActionBlock:^(NSUInteger index, - YapDatabaseReadWriteTransaction *transaction, - ActionSuccessBlock success, - ActionFailureBlock failure) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self sendTextMessageInThread:thread counter:index]; - // TODO: - success(); - }); - }]; -} - -+ (void)sendAttachmentWithFilePath:(NSString *)filePath - thread:(TSThread *)thread - label:(NSString *)label - hasCaption:(BOOL)hasCaption - success:(nullable void (^)(void))success - failure:(nullable void (^)(void))failure -{ - OWSAssertDebug(filePath); - OWSAssertDebug(thread); - - NSString *filename = [filePath lastPathComponent]; - NSString *utiType = [MIMETypeUtil utiTypeForFileExtension:filename.pathExtension]; - DataSource *_Nullable dataSource = [DataSourcePath dataSourceWithFilePath:filePath shouldDeleteOnDeallocation:NO]; - [dataSource setSourceFilename:filename]; - SignalAttachment *attachment = - [SignalAttachment attachmentWithDataSource:dataSource dataUTI:utiType imageQuality:TSImageQualityOriginal]; - - NSString *messageBody = nil; - if (hasCaption) { - // We want a message body that is "more than one line on all devices, - // using all dynamic type sizes." - NSString *sampleText = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, " - @"consectetur adipiscing elit."; - messageBody = [[label stringByAppendingString:@" "] stringByAppendingString:sampleText]; - - messageBody = [messageBody stringByAppendingString:@" 🔤"]; - } - attachment.captionText = messageBody; - - OWSAssertDebug(attachment); - if ([attachment hasError]) { - OWSLogError(@"attachment[%@]: %@", [attachment sourceFilename], [attachment errorName]); - [DDLog flushLog]; - } - OWSAssertDebug(![attachment hasError]); - - [self sendAttachment:attachment thread:thread messageBody:messageBody]; - - success(); -} - -#pragma mark - Infrastructure - -+ (void)performActionNTimes:(DebugUIMessagesAction *)action -{ - OWSAssertIsOnMainThread(); - OWSAssertDebug(action); - - UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"How many?" - message:nil - preferredStyle:UIAlertControllerStyleActionSheet]; - for (NSNumber *countValue in @[ - @(1), - @(10), - @(100), - @(1 * 1000), - @(10 * 1000), - ]) { - [alert addAction:[UIAlertAction actionWithTitle:countValue.stringValue - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *ignore) { - [action prepareAndPerformNTimes:countValue.unsignedIntegerValue]; - }]]; - } - - [alert addAction:[OWSAlerts cancelAction]]; - UIViewController *fromViewController = [[UIApplication sharedApplication] frontmostViewController]; - [fromViewController presentAlert:alert]; -} - -#pragma mark - Send Media - -+ (NSArray *)allSendMediaActions:(TSThread *)thread -{ - OWSAssertDebug(thread); - - NSArray *actions = @[ - [self sendJpegAction:thread hasCaption:NO], - [self sendJpegAction:thread hasCaption:YES], - [self sendGifAction:thread hasCaption:NO], - [self sendGifAction:thread hasCaption:YES], - [self sendLargeGifAction:thread hasCaption:NO], - [self sendLargeGifAction:thread hasCaption:YES], - [self sendMp3Action:thread hasCaption:NO], - [self sendMp3Action:thread hasCaption:YES], - [self sendMp4Action:thread hasCaption:NO], - [self sendMp4Action:thread hasCaption:YES], - ]; - return actions; -} - -+ (DebugUIMessagesAction *)sendJpegAction:(TSThread *)thread hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self sendMediaAction:@"Send Jpeg" - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader jpegInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)sendGifAction:(TSThread *)thread hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self sendMediaAction:@"Send Gif" - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader gifInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)sendLargeGifAction:(TSThread *)thread hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self sendMediaAction:@"Send Large Gif" - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader largeGifInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)sendMp3Action:(TSThread *)thread hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self sendMediaAction:@"Send Mp3" - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader mp3Instance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)sendMp4Action:(TSThread *)thread hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self sendMediaAction:@"Send Mp4" - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader mp4Instance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)sendMediaAction:(NSString *)labelParam - hasCaption:(BOOL)hasCaption - fakeAssetLoader:(DebugUIMessagesAssetLoader *)fakeAssetLoader - thread:(TSThread *)thread -{ - OWSAssertDebug(labelParam.length > 0); - OWSAssertDebug(fakeAssetLoader); - OWSAssertDebug(thread); - - NSString *label = labelParam; - if (hasCaption) { - label = [label stringByAppendingString:@" 🔤"]; - } - - return [DebugUIMessagesSingleAction - actionWithLabel:label - staggeredActionBlock:^(NSUInteger index, - YapDatabaseReadWriteTransaction *transaction, - ActionSuccessBlock success, - ActionFailureBlock failure) { - dispatch_async(dispatch_get_main_queue(), ^{ - OWSAssertDebug(fakeAssetLoader.filePath.length > 0); - [self sendAttachmentWithFilePath:fakeAssetLoader.filePath - thread:thread - label:label - hasCaption:hasCaption - success:success - failure:failure]; - }); - } - prepareBlock:fakeAssetLoader.prepareBlock]; -} - -+ (DebugUIMessagesAction *)sendAllMediaAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesGroupAction allGroupActionWithLabel:@"All Send Media" - subactions:[self allSendMediaActions:thread]]; -} - -+ (DebugUIMessagesAction *)sendRandomMediaAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesGroupAction randomGroupActionWithLabel:@"Random Send Media" - subactions:[self allSendMediaActions:thread]]; -} - -+ (void)selectSendMediaAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - [self selectActionUI:[self allSendMediaActions:thread] label:@"Select Send Media"]; -} - -#pragma mark - Fake Outgoing Media - -+ (DebugUIMessagesAction *)fakeOutgoingJpegAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:@"Fake Outgoing Jpeg" - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader jpegInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingGifAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:@"Fake Outgoing Gif" - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader gifInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingLargeGifAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:@"Fake Outgoing Large Gif" - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader largeGifInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingMp3Action:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:@"Fake Outgoing Mp3" - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader mp3Instance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingMp4Action:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:@"Fake Outgoing Mp4" - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader mp4Instance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingCompactPortraitPngAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:@"Fake Outgoing Portrait Png" - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader compactLandscapePngInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingCompactLandscapePngAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:@"Fake Outgoing Landscape Png" - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader compactPortraitPngInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingTallPortraitPngAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:@"Fake Outgoing Tall Portrait Png" - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader tallPortraitPngInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingWideLandscapePngAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:@"Fake Outgoing Wide Landscape Png" - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader wideLandscapePngInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingLargePngAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:@"Fake Outgoing Large Png" - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader largePngInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingTinyPngAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:@"Fake Outgoing Tiny Png" - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader tinyPngInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingPngAction:(TSThread *)thread - actionLabel:(NSString *)actionLabel - imageSize:(CGSize)imageSize - backgroundColor:(UIColor *)backgroundColor - textColor:(UIColor *)textColor - imageLabel:(NSString *)imageLabel - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:actionLabel - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader pngInstanceWithSize:imageSize - backgroundColor:backgroundColor - textColor:textColor - label:imageLabel] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingTinyPdfAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:@"Fake Outgoing Tiny Pdf" - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader tinyPdfInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingLargePdfAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:@"Fake Outgoing Large Pdf" - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader largePdfInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingMissingPngAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:@"Fake Outgoing Missing Png" - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader missingPngInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingMissingPdfAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:@"Fake Outgoing Missing Pdf" - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader missingPdfInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingOversizeTextAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeOutgoingMediaAction:@"Fake Outgoing Oversize Text" - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader oversizeTextInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingMediaAction:(NSString *)labelParam - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption - fakeAssetLoader:(DebugUIMessagesAssetLoader *)fakeAssetLoader - thread:(TSThread *)thread -{ - OWSAssertDebug(labelParam.length > 0); - OWSAssertDebug(fakeAssetLoader); - OWSAssertDebug(thread); - - NSString *label = [labelParam stringByAppendingString:[self actionLabelForHasCaption:hasCaption - outgoingMessageState:messageState - isDelivered:NO - isRead:NO]]; - - return - [DebugUIMessagesSingleAction actionWithLabel:label - unstaggeredActionBlock:^(NSUInteger index, YapDatabaseReadWriteTransaction *transaction) { - OWSAssertDebug(fakeAssetLoader.filePath.length > 0); - [self createFakeOutgoingMedia:index - messageState:messageState - hasCaption:hasCaption - fakeAssetLoader:fakeAssetLoader - thread:thread - transaction:transaction]; - } - prepareBlock:fakeAssetLoader.prepareBlock]; -} - -+ (void)createFakeOutgoingMedia:(NSUInteger)index - messageState:(TSOutgoingMessageState)messageState - hasCaption:(BOOL)hasCaption - fakeAssetLoader:(DebugUIMessagesAssetLoader *)fakeAssetLoader - thread:(TSThread *)thread - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(thread); - OWSAssertDebug(fakeAssetLoader.filePath); - OWSAssertDebug(transaction); - - // Random time within last n years. Helpful for filling out a media gallery over time. - // double yearsMillis = 4.0 * kYearsInMs; - // uint64_t millisAgo = (uint64_t)(((double)arc4random() / ((double)0xffffffff)) * yearsMillis); - // uint64_t timestamp = [NSDate ows_millisecondTimeStamp] - millisAgo; - uint64_t timestamp = [NSDate ows_millisecondTimeStamp]; - - NSString *messageBody = nil; - if (hasCaption) { - // We want a message body that is "more than one line on all devices, - // using all dynamic type sizes." - NSString *sampleText = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, " - @"consectetur adipiscing elit."; - messageBody = [[@(index).stringValue stringByAppendingString:@" "] stringByAppendingString:sampleText]; - messageBody = [messageBody stringByAppendingString:[self actionLabelForHasCaption:hasCaption - outgoingMessageState:messageState - isDelivered:NO - isRead:NO]]; - } - - TSOutgoingMessage *message = [self createFakeOutgoingMessage:thread - messageBody:messageBody - fakeAssetLoader:fakeAssetLoader - messageState:messageState - isDelivered:YES - isRead:NO - quotedMessage:nil - contactShare:nil - linkPreview:nil - transaction:transaction]; - - // This is a hack to "back-date" the message. - [message setReceivedAtTimestamp:timestamp]; - - [message saveWithTransaction:transaction]; -} - -#pragma mark - Fake Incoming Media - -+ (DebugUIMessagesAction *)fakeIncomingJpegAction:(TSThread *)thread - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:@"Fake Incoming Jpeg" - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader jpegInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingGifAction:(TSThread *)thread - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:@"Fake Incoming Gif" - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader gifInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingLargeGifAction:(TSThread *)thread - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:@"Fake Incoming Large Gif" - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader largeGifInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingMp3Action:(TSThread *)thread - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:@"Fake Incoming Mp3" - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader mp3Instance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingMp4Action:(TSThread *)thread - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:@"Fake Incoming Mp4" - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader mp4Instance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingCompactPortraitPngAction:(TSThread *)thread - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:@"Fake Incoming Portrait Png" - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader compactPortraitPngInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingCompactLandscapePngAction:(TSThread *)thread - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:@"Fake Incoming Landscape Png" - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader compactLandscapePngInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingTallPortraitPngAction:(TSThread *)thread - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:@"Fake Incoming Tall Portrait Png" - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader tallPortraitPngInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingWideLandscapePngAction:(TSThread *)thread - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:@"Fake Incoming Wide Landscape Png" - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader wideLandscapePngInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingLargePngAction:(TSThread *)thread - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:@"Fake Incoming Large Png" - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader largePngInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingTinyPngAction:(TSThread *)thread - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:@"Tiny Incoming Large Png" - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader tinyPngInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingPngAction:(TSThread *)thread - actionLabel:(NSString *)actionLabel - imageSize:(CGSize)imageSize - backgroundColor:(UIColor *)backgroundColor - textColor:(UIColor *)textColor - imageLabel:(NSString *)imageLabel - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:actionLabel - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader pngInstanceWithSize:imageSize - backgroundColor:backgroundColor - textColor:textColor - label:imageLabel] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingTinyPdfAction:(TSThread *)thread - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:@"Fake Incoming Tiny Pdf" - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader tinyPdfInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingLargePdfAction:(TSThread *)thread - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:@"Fake Incoming Large Pdf" - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader largePdfInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingMissingPngAction:(TSThread *)thread - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:@"Fake Incoming Missing Png" - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader missingPngInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingMissingPdfAction:(TSThread *)thread - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:@"Fake Incoming Missing Pdf" - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader missingPdfInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingOversizeTextAction:(TSThread *)thread - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption -{ - OWSAssertDebug(thread); - - return [self fakeIncomingMediaAction:@"Fake Incoming Oversize Text" - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:[DebugUIMessagesAssetLoader oversizeTextInstance] - thread:thread]; -} - -+ (DebugUIMessagesAction *)fakeIncomingMediaAction:(NSString *)labelParam - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption - fakeAssetLoader:(DebugUIMessagesAssetLoader *)fakeAssetLoader - thread:(TSThread *)thread -{ - OWSAssertDebug(labelParam.length > 0); - OWSAssertDebug(fakeAssetLoader); - OWSAssertDebug(thread); - - NSString *label = labelParam; - if (hasCaption) { - label = [label stringByAppendingString:@" 🔤"]; - } - - if (isAttachmentDownloaded) { - label = [label stringByAppendingString:@" 👍"]; - } - - return - [DebugUIMessagesSingleAction actionWithLabel:label - unstaggeredActionBlock:^(NSUInteger index, YapDatabaseReadWriteTransaction *transaction) { - OWSAssertDebug(fakeAssetLoader.filePath.length > 0); - [self createFakeIncomingMedia:index - isAttachmentDownloaded:isAttachmentDownloaded - hasCaption:hasCaption - fakeAssetLoader:fakeAssetLoader - thread:thread - transaction:transaction]; - } - prepareBlock:fakeAssetLoader.prepareBlock]; -} - -+ (TSIncomingMessage *)createFakeIncomingMedia:(NSUInteger)index - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - hasCaption:(BOOL)hasCaption - fakeAssetLoader:(DebugUIMessagesAssetLoader *)fakeAssetLoader - thread:(TSThread *)thread - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - NSString *_Nullable caption = nil; - if (hasCaption) { - // We want a message body that is "more than one line on all devices, - // using all dynamic type sizes." - caption = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, " - @"consectetur adipiscing elit."; - } - return [self createFakeIncomingMedia:index - isAttachmentDownloaded:isAttachmentDownloaded - caption:caption - fakeAssetLoader:fakeAssetLoader - thread:thread - transaction:transaction]; -} - -+ (TSIncomingMessage *)createFakeIncomingMedia:(NSUInteger)index - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - caption:(nullable NSString *)caption - fakeAssetLoader:(DebugUIMessagesAssetLoader *)fakeAssetLoader - thread:(TSThread *)thread - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(thread); - OWSAssertDebug(fakeAssetLoader.filePath); - OWSAssertDebug(transaction); - - // // Random time within last n years. Helpful for filling out a media gallery over time. - // double yearsMillis = 4.0 * kYearsInMs; - // uint64_t millisAgo = (uint64_t)(((double)arc4random() / ((double)0xffffffff)) * yearsMillis); - // uint64_t timestamp = [NSDate ows_millisecondTimeStamp] - millisAgo; - - NSString *messageBody = nil; - if (caption) { - messageBody = [[@(index).stringValue stringByAppendingString:@" "] stringByAppendingString:caption]; - - messageBody = [messageBody stringByAppendingString:@" 🔤"]; - - if (isAttachmentDownloaded) { - messageBody = [messageBody stringByAppendingString:@" 👍"]; - } - } - - return [self createFakeIncomingMessage:thread - messageBody:messageBody - fakeAssetLoader:fakeAssetLoader - isAttachmentDownloaded:isAttachmentDownloaded - quotedMessage:nil - transaction:transaction]; -} - -#pragma mark - Fake Media - -+ (NSArray *)allFakeMediaActions:(TSThread *)thread includeLabels:(BOOL)includeLabels -{ - OWSAssertDebug(thread); - - NSMutableArray *actions = [NSMutableArray new]; - - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Jpeg ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeOutgoingJpegAction:thread messageState:TSOutgoingMessageStateFailed hasCaption:NO], - [self fakeOutgoingJpegAction:thread messageState:TSOutgoingMessageStateFailed hasCaption:YES], - [self fakeOutgoingJpegAction:thread messageState:TSOutgoingMessageStateSending hasCaption:NO], - [self fakeOutgoingJpegAction:thread messageState:TSOutgoingMessageStateSending hasCaption:YES], - [self fakeOutgoingJpegAction:thread messageState:TSOutgoingMessageStateSent hasCaption:NO], - [self fakeOutgoingJpegAction:thread messageState:TSOutgoingMessageStateSent hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Gif ⚠️"]]; - } - [actions addObjectsFromArray:@[ - // Don't bother with multiple GIF states. - [self fakeOutgoingGifAction:thread messageState:TSOutgoingMessageStateSent hasCaption:NO], - [self fakeOutgoingLargeGifAction:thread messageState:TSOutgoingMessageStateSent hasCaption:NO], - ]]; - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Mp3 ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeOutgoingMp3Action:thread messageState:TSOutgoingMessageStateSending hasCaption:YES], - [self fakeOutgoingMp3Action:thread messageState:TSOutgoingMessageStateSending hasCaption:NO], - [self fakeOutgoingMp3Action:thread messageState:TSOutgoingMessageStateFailed hasCaption:NO], - [self fakeOutgoingMp3Action:thread messageState:TSOutgoingMessageStateFailed hasCaption:YES], - [self fakeOutgoingMp3Action:thread messageState:TSOutgoingMessageStateSent hasCaption:NO], - [self fakeOutgoingMp3Action:thread messageState:TSOutgoingMessageStateSent hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Mp4 ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeOutgoingMp4Action:thread messageState:TSOutgoingMessageStateSending hasCaption:NO], - [self fakeOutgoingMp4Action:thread messageState:TSOutgoingMessageStateSending hasCaption:YES], - [self fakeOutgoingMp4Action:thread messageState:TSOutgoingMessageStateFailed hasCaption:NO], - [self fakeOutgoingMp4Action:thread messageState:TSOutgoingMessageStateFailed hasCaption:YES], - [self fakeOutgoingMp4Action:thread messageState:TSOutgoingMessageStateSent hasCaption:NO], - [self fakeOutgoingMp4Action:thread messageState:TSOutgoingMessageStateSent hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Compact Landscape Png ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeOutgoingCompactLandscapePngAction:thread messageState:TSOutgoingMessageStateSending hasCaption:NO], - [self fakeOutgoingCompactLandscapePngAction:thread messageState:TSOutgoingMessageStateSending hasCaption:YES], - [self fakeOutgoingCompactLandscapePngAction:thread messageState:TSOutgoingMessageStateFailed hasCaption:NO], - [self fakeOutgoingCompactLandscapePngAction:thread messageState:TSOutgoingMessageStateFailed hasCaption:YES], - [self fakeOutgoingCompactLandscapePngAction:thread messageState:TSOutgoingMessageStateSent hasCaption:NO], - [self fakeOutgoingCompactLandscapePngAction:thread messageState:TSOutgoingMessageStateSent hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Compact Portrait Png ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeOutgoingCompactPortraitPngAction:thread messageState:TSOutgoingMessageStateSending hasCaption:NO], - [self fakeOutgoingCompactPortraitPngAction:thread messageState:TSOutgoingMessageStateSending hasCaption:YES], - [self fakeOutgoingCompactPortraitPngAction:thread messageState:TSOutgoingMessageStateFailed hasCaption:NO], - [self fakeOutgoingCompactPortraitPngAction:thread messageState:TSOutgoingMessageStateFailed hasCaption:YES], - [self fakeOutgoingCompactPortraitPngAction:thread messageState:TSOutgoingMessageStateSent hasCaption:NO], - [self fakeOutgoingCompactPortraitPngAction:thread messageState:TSOutgoingMessageStateSent hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Wide Landscape Png ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeOutgoingWideLandscapePngAction:thread messageState:TSOutgoingMessageStateSending hasCaption:NO], - [self fakeOutgoingWideLandscapePngAction:thread messageState:TSOutgoingMessageStateSending hasCaption:YES], - [self fakeOutgoingWideLandscapePngAction:thread messageState:TSOutgoingMessageStateFailed hasCaption:NO], - [self fakeOutgoingWideLandscapePngAction:thread messageState:TSOutgoingMessageStateFailed hasCaption:YES], - [self fakeOutgoingWideLandscapePngAction:thread messageState:TSOutgoingMessageStateSent hasCaption:NO], - [self fakeOutgoingWideLandscapePngAction:thread messageState:TSOutgoingMessageStateSent hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Tall Portrait Png ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeOutgoingTallPortraitPngAction:thread messageState:TSOutgoingMessageStateSending hasCaption:NO], - [self fakeOutgoingTallPortraitPngAction:thread messageState:TSOutgoingMessageStateSending hasCaption:YES], - [self fakeOutgoingTallPortraitPngAction:thread messageState:TSOutgoingMessageStateFailed hasCaption:NO], - [self fakeOutgoingTallPortraitPngAction:thread messageState:TSOutgoingMessageStateFailed hasCaption:YES], - [self fakeOutgoingTallPortraitPngAction:thread messageState:TSOutgoingMessageStateSent hasCaption:NO], - [self fakeOutgoingTallPortraitPngAction:thread messageState:TSOutgoingMessageStateSent hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Large Png ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeOutgoingLargePngAction:thread messageState:TSOutgoingMessageStateSent hasCaption:NO], - [self fakeOutgoingLargePngAction:thread messageState:TSOutgoingMessageStateSent hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Tiny Png ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeOutgoingTinyPngAction:thread messageState:TSOutgoingMessageStateSent hasCaption:NO], - [self fakeOutgoingTinyPngAction:thread messageState:TSOutgoingMessageStateSent hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Reserved Color Png ⚠️"]]; - } - - ConversationStyle *conversationStyle = [[ConversationStyle alloc] initWithThread:thread]; - [actions addObjectsFromArray:@[ - [self fakeOutgoingPngAction:thread - actionLabel:@"Fake Outgoing White Png" - imageSize:CGSizeMake(200.f, 200.f) - backgroundColor:[UIColor whiteColor] - textColor:[UIColor ows_signalBrandBlueColor] - imageLabel:@"W" - messageState:TSOutgoingMessageStateFailed - hasCaption:YES], - [self fakeOutgoingPngAction:thread - actionLabel:@"Fake Outgoing White Png" - imageSize:CGSizeMake(200.f, 200.f) - backgroundColor:[UIColor whiteColor] - textColor:[UIColor ows_signalBrandBlueColor] - imageLabel:@"W" - messageState:TSOutgoingMessageStateSending - hasCaption:YES], - [self fakeOutgoingPngAction:thread - actionLabel:@"Fake Outgoing White Png" - imageSize:CGSizeMake(200.f, 200.f) - backgroundColor:[UIColor whiteColor] - textColor:[UIColor ows_signalBrandBlueColor] - imageLabel:@"W" - messageState:TSOutgoingMessageStateSent - hasCaption:YES], - - [self fakeOutgoingPngAction:thread - actionLabel:@"Fake Outgoing 'Outgoing' Png" - imageSize:CGSizeMake(200.f, 200.f) - backgroundColor:[conversationStyle bubbleColorWithIsIncoming:NO] - textColor:[UIColor whiteColor] - imageLabel:@"W" - messageState:TSOutgoingMessageStateFailed - hasCaption:YES], - [self fakeOutgoingPngAction:thread - actionLabel:@"Fake Outgoing 'Outgoing' Png" - imageSize:CGSizeMake(200.f, 200.f) - backgroundColor:[conversationStyle bubbleColorWithIsIncoming:NO] - textColor:[UIColor whiteColor] - imageLabel:@"W" - messageState:TSOutgoingMessageStateSending - hasCaption:YES], - [self fakeOutgoingPngAction:thread - actionLabel:@"Fake Outgoing 'Outgoing' Png" - imageSize:CGSizeMake(200.f, 200.f) - backgroundColor:[conversationStyle bubbleColorWithIsIncoming:NO] - textColor:[UIColor whiteColor] - imageLabel:@"W" - messageState:TSOutgoingMessageStateSent - hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Tiny Pdf ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeOutgoingTinyPdfAction:thread messageState:TSOutgoingMessageStateSending hasCaption:NO], - [self fakeOutgoingTinyPdfAction:thread messageState:TSOutgoingMessageStateSending hasCaption:YES], - [self fakeOutgoingTinyPdfAction:thread messageState:TSOutgoingMessageStateFailed hasCaption:NO], - [self fakeOutgoingTinyPdfAction:thread messageState:TSOutgoingMessageStateFailed hasCaption:YES], - [self fakeOutgoingTinyPdfAction:thread messageState:TSOutgoingMessageStateSent hasCaption:NO], - [self fakeOutgoingTinyPdfAction:thread messageState:TSOutgoingMessageStateSent hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Large Pdf ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeOutgoingLargePdfAction:thread messageState:TSOutgoingMessageStateFailed hasCaption:NO], - ]]; - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Missing Png ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeOutgoingMissingPngAction:thread messageState:TSOutgoingMessageStateFailed hasCaption:NO], - ]]; - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Large Pdf ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeOutgoingMissingPdfAction:thread messageState:TSOutgoingMessageStateFailed hasCaption:NO], - ]]; - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Oversize Text ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeOutgoingOversizeTextAction:thread messageState:TSOutgoingMessageStateFailed hasCaption:NO], - [self fakeOutgoingOversizeTextAction:thread messageState:TSOutgoingMessageStateSending hasCaption:NO], - [self fakeOutgoingOversizeTextAction:thread messageState:TSOutgoingMessageStateSent hasCaption:NO], - ]]; - - // Incoming - - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Jpg ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeIncomingJpegAction:thread isAttachmentDownloaded:NO hasCaption:NO], - [self fakeIncomingJpegAction:thread isAttachmentDownloaded:YES hasCaption:NO], - [self fakeIncomingJpegAction:thread isAttachmentDownloaded:NO hasCaption:YES], - [self fakeIncomingJpegAction:thread isAttachmentDownloaded:YES hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Gif ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeIncomingGifAction:thread isAttachmentDownloaded:YES hasCaption:NO], - [self fakeIncomingLargeGifAction:thread isAttachmentDownloaded:YES hasCaption:NO], - ]]; - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Mp3 ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeIncomingMp3Action:thread isAttachmentDownloaded:NO hasCaption:NO], - [self fakeIncomingMp3Action:thread isAttachmentDownloaded:YES hasCaption:NO], - [self fakeIncomingMp3Action:thread isAttachmentDownloaded:NO hasCaption:YES], - [self fakeIncomingMp3Action:thread isAttachmentDownloaded:YES hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Mp4 ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeIncomingMp4Action:thread isAttachmentDownloaded:NO hasCaption:NO], - [self fakeIncomingMp4Action:thread isAttachmentDownloaded:YES hasCaption:NO], - [self fakeIncomingMp4Action:thread isAttachmentDownloaded:NO hasCaption:YES], - [self fakeIncomingMp4Action:thread isAttachmentDownloaded:YES hasCaption:YES], - ]]; - if (includeLabels) { - [actions - addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Compact Landscape Png ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeIncomingCompactLandscapePngAction:thread isAttachmentDownloaded:NO hasCaption:NO], - [self fakeIncomingCompactLandscapePngAction:thread isAttachmentDownloaded:YES hasCaption:NO], - [self fakeIncomingCompactLandscapePngAction:thread isAttachmentDownloaded:NO hasCaption:YES], - [self fakeIncomingCompactLandscapePngAction:thread isAttachmentDownloaded:YES hasCaption:YES], - ]]; - if (includeLabels) { - [actions - addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Compact Portrait Png ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeIncomingCompactPortraitPngAction:thread isAttachmentDownloaded:NO hasCaption:NO], - [self fakeIncomingCompactPortraitPngAction:thread isAttachmentDownloaded:YES hasCaption:NO], - [self fakeIncomingCompactPortraitPngAction:thread isAttachmentDownloaded:NO hasCaption:YES], - [self fakeIncomingCompactPortraitPngAction:thread isAttachmentDownloaded:YES hasCaption:YES], - ]]; - if (includeLabels) { - [actions - addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Wide Landscape Png ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeIncomingWideLandscapePngAction:thread isAttachmentDownloaded:NO hasCaption:NO], - [self fakeIncomingWideLandscapePngAction:thread isAttachmentDownloaded:YES hasCaption:NO], - [self fakeIncomingWideLandscapePngAction:thread isAttachmentDownloaded:NO hasCaption:YES], - [self fakeIncomingWideLandscapePngAction:thread isAttachmentDownloaded:YES hasCaption:YES], - ]]; - if (includeLabels) { - [actions - addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Tall Portrait Png ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeIncomingTallPortraitPngAction:thread isAttachmentDownloaded:NO hasCaption:NO], - [self fakeIncomingTallPortraitPngAction:thread isAttachmentDownloaded:YES hasCaption:NO], - [self fakeIncomingTallPortraitPngAction:thread isAttachmentDownloaded:NO hasCaption:YES], - [self fakeIncomingTallPortraitPngAction:thread isAttachmentDownloaded:YES hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Large Png ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeIncomingLargePngAction:thread isAttachmentDownloaded:YES hasCaption:NO], - [self fakeIncomingLargePngAction:thread isAttachmentDownloaded:YES hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Tiny Png ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeIncomingTinyPngAction:thread isAttachmentDownloaded:YES hasCaption:NO], - [self fakeIncomingTinyPngAction:thread isAttachmentDownloaded:YES hasCaption:YES], - ]]; - if (includeLabels) { - [actions - addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Reserved Color Png ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeIncomingPngAction:thread - actionLabel:@"Fake Incoming White Png" - imageSize:CGSizeMake(200.f, 200.f) - backgroundColor:[UIColor whiteColor] - textColor:[UIColor ows_signalBrandBlueColor] - imageLabel:@"W" - isAttachmentDownloaded:YES - hasCaption:YES], - [self fakeIncomingPngAction:thread - actionLabel:@"Fake Incoming White Png" - imageSize:CGSizeMake(200.f, 200.f) - backgroundColor:[UIColor whiteColor] - textColor:[UIColor ows_signalBrandBlueColor] - imageLabel:@"W" - isAttachmentDownloaded:NO - hasCaption:YES], - [self fakeIncomingPngAction:thread - actionLabel:@"Fake Incoming 'Incoming' Png" - imageSize:CGSizeMake(200.f, 200.f) - backgroundColor:[conversationStyle conversationColor].primaryColor - textColor:[UIColor whiteColor] - imageLabel:@"W" - isAttachmentDownloaded:YES - hasCaption:YES], - [self fakeIncomingPngAction:thread - actionLabel:@"Fake Incoming 'Incoming' Png" - imageSize:CGSizeMake(200.f, 200.f) - backgroundColor:[conversationStyle conversationColor].shadeColor - textColor:[UIColor whiteColor] - imageLabel:@"W" - isAttachmentDownloaded:YES - hasCaption:YES], - [self fakeIncomingPngAction:thread - actionLabel:@"Fake Incoming 'Incoming' Png" - imageSize:CGSizeMake(200.f, 200.f) - backgroundColor:[conversationStyle conversationColor].primaryColor - textColor:[UIColor whiteColor] - imageLabel:@"W" - isAttachmentDownloaded:NO - hasCaption:YES], - [self fakeIncomingPngAction:thread - actionLabel:@"Fake Incoming 'Incoming' Png" - imageSize:CGSizeMake(200.f, 200.f) - backgroundColor:[conversationStyle conversationColor].shadeColor - textColor:[UIColor whiteColor] - imageLabel:@"W" - isAttachmentDownloaded:NO - hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Tiny Pdf ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeIncomingTinyPdfAction:thread isAttachmentDownloaded:NO hasCaption:NO], - [self fakeIncomingTinyPdfAction:thread isAttachmentDownloaded:YES hasCaption:NO], - [self fakeIncomingTinyPdfAction:thread isAttachmentDownloaded:NO hasCaption:YES], - [self fakeIncomingTinyPdfAction:thread isAttachmentDownloaded:YES hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Large Pdf ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeIncomingLargePdfAction:thread isAttachmentDownloaded:YES hasCaption:NO], - ]]; - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Missing Png ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeIncomingMissingPngAction:thread isAttachmentDownloaded:YES hasCaption:NO], - [self fakeIncomingMissingPngAction:thread isAttachmentDownloaded:YES hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Missing Pdf ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeIncomingMissingPdfAction:thread isAttachmentDownloaded:YES hasCaption:NO], - [self fakeIncomingMissingPdfAction:thread isAttachmentDownloaded:YES hasCaption:YES], - ]]; - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Oversize Text ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeIncomingOversizeTextAction:thread isAttachmentDownloaded:NO hasCaption:NO], - [self fakeIncomingOversizeTextAction:thread isAttachmentDownloaded:YES hasCaption:NO], - ]]; - return actions; -} - -+ (DebugUIMessagesAction *)fakeAllMediaAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesGroupAction allGroupActionWithLabel:@"All Fake Media" - subactions:[self allFakeMediaActions:thread includeLabels:YES]]; -} - -+ (DebugUIMessagesAction *)fakeRandomMediaAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesGroupAction randomGroupActionWithLabel:@"Random Fake Media" - subactions:[self allFakeMediaActions:thread includeLabels:NO]]; -} - -#pragma mark - Send Text Messages - -+ (DebugUIMessagesAction *)sendShortTextMessageAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesSingleAction actionWithLabel:@"Send Short Text Message" - staggeredActionBlock:^(NSUInteger index, - YapDatabaseReadWriteTransaction *transaction, - ActionSuccessBlock success, - ActionFailureBlock failure) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self sendTextMessageInThread:thread counter:index]; - }); - }]; -} - -+ (DebugUIMessagesAction *)sendOversizeTextMessageAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesSingleAction actionWithLabel:@"Send Oversize Text Message" - staggeredActionBlock:^(NSUInteger index, - YapDatabaseReadWriteTransaction *transaction, - ActionSuccessBlock success, - ActionFailureBlock failure) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self sendOversizeTextMessage:thread]; - }); - }]; -} - -+ (DebugUIMessagesAction *)sendMessageVariationsAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - NSArray *actions = @[ - [self sendShortTextMessageAction:thread], - [self sendOversizeTextMessageAction:thread], - ]; - - return [DebugUIMessagesGroupAction allGroupActionWithLabel:@"Send Conversation Cell Variations" subactions:actions]; -} - -#pragma mark - Fake Text Messages - -+ (DebugUIMessagesAction *)fakeShortIncomingTextMessageAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesSingleAction - actionWithLabel:@"Fake Short Incoming Text Message" - unstaggeredActionBlock:^(NSUInteger index, YapDatabaseReadWriteTransaction *transaction) { - NSString *messageBody = - [[@(index).stringValue stringByAppendingString:@" "] stringByAppendingString:[self randomText]]; - [self createFakeIncomingMessage:thread - messageBody:messageBody - fakeAssetLoader:nil - isAttachmentDownloaded:NO - quotedMessage:nil - transaction:transaction]; - }]; -} - -+ (SignalAttachment *)signalAttachmentForFilePath:(NSString *)filePath -{ - OWSAssertDebug(filePath); - - NSString *filename = [filePath lastPathComponent]; - NSString *utiType = [MIMETypeUtil utiTypeForFileExtension:filename.pathExtension]; - DataSource *_Nullable dataSource = [DataSourcePath dataSourceWithFilePath:filePath shouldDeleteOnDeallocation:NO]; - [dataSource setSourceFilename:filename]; - SignalAttachment *attachment = - [SignalAttachment attachmentWithDataSource:dataSource dataUTI:utiType imageQuality:TSImageQualityOriginal]; - if (arc4random_uniform(100) > 50) { - attachment.captionText = [self randomCaptionText]; - } - - OWSAssertDebug(attachment); - if ([attachment hasError]) { - OWSLogError(@"attachment[%@]: %@", [attachment sourceFilename], [attachment errorName]); - [DDLog flushLog]; - } - OWSAssertDebug(![attachment hasError]); - return attachment; -} - -+ (void)sendAttachment:(nullable SignalAttachment *)attachment - thread:(TSThread *)thread - messageBody:(nullable NSString *)messageBody -{ - [self.dbConnection readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { - NSArray *attachments = @[]; - if (attachment != nil) { - attachments = @[ attachment ]; - } - [ThreadUtil enqueueMessageWithText:messageBody - mediaAttachments:attachments - inThread:thread - quotedReplyModel:nil - linkPreviewDraft:nil - transaction:transaction]; - }]; -} - - -+ (DebugUIMessagesAction *)fakeIncomingTextMessageAction:(TSThread *)thread text:(NSString *)text -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesSingleAction - actionWithLabel:[NSString stringWithFormat:@"Fake Incoming Text Message (%@)", text] - unstaggeredActionBlock:^(NSUInteger index, YapDatabaseReadWriteTransaction *transaction) { - NSString *messageBody = [[@(index).stringValue stringByAppendingString:@" "] stringByAppendingString:text]; - [self createFakeIncomingMessage:thread - messageBody:messageBody - fakeAssetLoader:nil - isAttachmentDownloaded:NO - quotedMessage:nil - transaction:transaction]; - }]; -} - -+ (DebugUIMessagesAction *)fakeOutgoingTextMessageAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - text:(NSString *)text -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesSingleAction - actionWithLabel:[NSString stringWithFormat:@"Fake Incoming Text Message (%@)", text] - unstaggeredActionBlock:^(NSUInteger index, YapDatabaseReadWriteTransaction *transaction) { - NSString *messageBody = [[@(index).stringValue stringByAppendingString:@" "] stringByAppendingString:text]; - [self createFakeOutgoingMessage:thread - messageBody:messageBody - fakeAssetLoader:nil - messageState:messageState - isDelivered:NO - isRead:NO - quotedMessage:nil - contactShare:nil - linkPreview:nil - transaction:transaction]; - }]; -} - -+ (DebugUIMessagesAction *)fakeShortOutgoingTextMessageAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState -{ - return [self fakeShortOutgoingTextMessageAction:thread messageState:messageState isDelivered:NO isRead:NO]; -} - -+ (DebugUIMessagesAction *)fakeShortOutgoingTextMessageAction:(TSThread *)thread - messageState:(TSOutgoingMessageState)messageState - isDelivered:(BOOL)isDelivered - isRead:(BOOL)isRead -{ - return [self fakeShortOutgoingTextMessageAction:(TSThread *)thread - text:[self randomText] - messageState:messageState - isDelivered:isDelivered - isRead:isRead]; -} - -+ (DebugUIMessagesAction *)fakeShortOutgoingTextMessageAction:(TSThread *)thread - text:(NSString *)text - messageState:(TSOutgoingMessageState)messageState - isDelivered:(BOOL)isDelivered - isRead:(BOOL)isRead -{ - OWSAssertDebug(thread); - - NSString *label = @"Fake Short Incoming Text Message"; - label = [label stringByAppendingString:[self actionLabelForHasCaption:YES - outgoingMessageState:messageState - isDelivered:isDelivered - isRead:isRead]]; - - return [DebugUIMessagesSingleAction - actionWithLabel:label - unstaggeredActionBlock:^(NSUInteger index, YapDatabaseReadWriteTransaction *transaction) { - NSString *messageBody = [[@(index).stringValue stringByAppendingString:@" "] stringByAppendingString:text]; - [self createFakeOutgoingMessage:thread - messageBody:messageBody - fakeAssetLoader:nil - messageState:messageState - isDelivered:isDelivered - isRead:isRead - quotedMessage:nil - contactShare:nil - linkPreview:nil - transaction:transaction]; - }]; -} - -+ (NSArray *)allFakeTextActions:(TSThread *)thread includeLabels:(BOOL)includeLabels -{ - OWSAssertDebug(thread); - - NSArray *messageBodies = @[ - @"Hi", - @"1️⃣", - @"1️⃣2️⃣", - @"1️⃣2️⃣3️⃣", - @"落", - @"﷽", - ]; - - NSMutableArray *actions = [NSMutableArray new]; - - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"⚠️ Incoming Message Bodies ⚠️"]]; - } - [actions addObject:[self fakeShortIncomingTextMessageAction:thread]]; - for (NSString *messageBody in messageBodies) { - [actions addObject:[self fakeIncomingTextMessageAction:thread text:messageBody]]; - } - - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Statuses ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeShortOutgoingTextMessageAction:thread messageState:TSOutgoingMessageStateFailed], - [self fakeShortOutgoingTextMessageAction:thread messageState:TSOutgoingMessageStateSending], - [self fakeShortOutgoingTextMessageAction:thread messageState:TSOutgoingMessageStateSent], - [self fakeShortOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - isDelivered:YES - isRead:NO], - [self fakeShortOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - isDelivered:YES - isRead:YES], - ]]; - - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Outgoing Message Bodies ⚠️"]]; - } - for (NSString *messageBody in messageBodies) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:messageBody]]; - } - return actions; -} - -+ (DebugUIMessagesAction *)fakeAllTextAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesGroupAction allGroupActionWithLabel:@"All Fake Text" - subactions:[self allFakeTextActions:thread includeLabels:YES]]; -} - -+ (DebugUIMessagesAction *)fakeRandomTextAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesGroupAction randomGroupActionWithLabel:@"Random Fake Text" - subactions:[self allFakeTextActions:thread includeLabels:NO]]; -} - -#pragma mark - Fake Quoted Replies - -+ (DebugUIMessagesAction *) - fakeQuotedReplyAction:(TSThread *)thread - quotedMessageLabel:(NSString *)quotedMessageLabel - isQuotedMessageIncoming:(BOOL)isQuotedMessageIncoming - // Optional. At least one of quotedMessageBody and quotedMessageAssetLoader should be non-nil. - quotedMessageBody:(nullable NSString *)quotedMessageBody - // Optional. At least one of quotedMessageBody and quotedMessageAssetLoader should be non-nil. - quotedMessageAssetLoader:(nullable DebugUIMessagesAssetLoader *)quotedMessageAssetLoader - replyLabel:(NSString *)replyLabel - isReplyIncoming:(BOOL)isReplyIncoming - replyMessageBody:(nullable NSString *)replyMessageBody - replyAssetLoader:(nullable DebugUIMessagesAssetLoader *)replyAssetLoader - // Only applies if !isReplyIncoming. - replyMessageState:(TSOutgoingMessageState)replyMessageState -{ - OWSAssertDebug(thread); - - // Used fixed values for properties that shouldn't matter much. - BOOL quotedMessageIsDelivered = NO; - BOOL quotedMessageIsRead = NO; - TSOutgoingMessageState quotedMessageMessageState = TSOutgoingMessageStateSent; - BOOL replyIsDelivered = NO; - BOOL replyIsRead = NO; - - // Seamlessly convert oversize text messages to oversize text attachments. - if ([quotedMessageBody lengthOfBytesUsingEncoding:NSUTF8StringEncoding] >= kOversizeTextMessageSizeThreshold) { - OWSAssertDebug(!quotedMessageAssetLoader); - quotedMessageAssetLoader = [DebugUIMessagesAssetLoader oversizeTextInstanceWithText:quotedMessageBody]; - quotedMessageBody = nil; - } - if (replyMessageBody && - [replyMessageBody lengthOfBytesUsingEncoding:NSUTF8StringEncoding] >= kOversizeTextMessageSizeThreshold) { - OWSAssertDebug(!replyAssetLoader); - replyAssetLoader = [DebugUIMessagesAssetLoader oversizeTextInstanceWithText:replyMessageBody]; - replyMessageBody = nil; - } - - NSMutableString *label = [NSMutableString new]; - [label appendString:@"Quoted Reply ("]; - [label appendString:replyLabel]; - if (isReplyIncoming) { - } else { - [label appendString:[self actionLabelForHasCaption:NO - outgoingMessageState:replyMessageState - isDelivered:replyIsDelivered - isRead:replyIsRead]]; - } - [label appendString:@") to ("]; - [label appendString:quotedMessageLabel]; - if (quotedMessageAssetLoader) { - [label appendFormat:@" %@", quotedMessageAssetLoader.labelEmoji]; - } - if (isQuotedMessageIncoming) { - } else { - [label appendString:[self actionLabelForHasCaption:quotedMessageBody.length > 0 - outgoingMessageState:quotedMessageMessageState - isDelivered:quotedMessageIsDelivered - isRead:quotedMessageIsRead]]; - } - [label appendString:@")"]; - - NSMutableArray *prepareBlocks = [NSMutableArray new]; - if (quotedMessageAssetLoader.prepareBlock) { - [prepareBlocks addObject:quotedMessageAssetLoader.prepareBlock]; - } - if (replyAssetLoader.prepareBlock) { - [prepareBlocks addObject:replyAssetLoader.prepareBlock]; - } - - // We don't need to configure ConversationStyle's view width in this case. - ConversationStyle *conversationStyle = [[ConversationStyle alloc] initWithThread:thread]; - - return [DebugUIMessagesSingleAction - actionWithLabel:label - unstaggeredActionBlock:^(NSUInteger index, YapDatabaseReadWriteTransaction *transaction) { - NSString *_Nullable quotedMessageBodyWIndex - = (quotedMessageBody ? [NSString stringWithFormat:@"%zd %@", index, quotedMessageBody] : nil); - TSQuotedMessage *_Nullable quotedMessage = nil; - if (isQuotedMessageIncoming) { - TSIncomingMessage *_Nullable messageToQuote = nil; - messageToQuote = [self createFakeIncomingMessage:thread - messageBody:quotedMessageBodyWIndex - fakeAssetLoader:quotedMessageAssetLoader - isAttachmentDownloaded:YES - quotedMessage:nil - transaction:transaction]; - OWSAssertDebug(messageToQuote); - OWSLogVerbose(@"%@", label); - [DDLog flushLog]; - id viewItem = - [[ConversationInteractionViewItem alloc] initWithInteraction:messageToQuote - isGroupThread:thread.isGroupThread - isRSSFeed:NO - transaction:transaction - conversationStyle:conversationStyle]; - quotedMessage = [ - [OWSQuotedReplyModel quotedReplyForSendingWithConversationViewItem:viewItem threadId:viewItem.interaction.uniqueThreadId transaction:transaction] - buildQuotedMessageForSending]; - } else { - TSOutgoingMessage *_Nullable messageToQuote = [self createFakeOutgoingMessage:thread - messageBody:quotedMessageBodyWIndex - fakeAssetLoader:quotedMessageAssetLoader - messageState:quotedMessageMessageState - isDelivered:quotedMessageIsDelivered - isRead:quotedMessageIsRead - quotedMessage:nil - contactShare:nil - linkPreview:nil - transaction:transaction]; - OWSAssertDebug(messageToQuote); - - id viewItem = - [[ConversationInteractionViewItem alloc] initWithInteraction:messageToQuote - isGroupThread:thread.isGroupThread - isRSSFeed:NO - transaction:transaction - conversationStyle:conversationStyle]; - quotedMessage = [[OWSQuotedReplyModel quotedReplyForSendingWithConversationViewItem:viewItem threadId:viewItem.interaction.uniqueThreadId transaction:transaction] - buildQuotedMessageForSending]; - } - OWSAssertDebug(quotedMessage); - - NSString *_Nullable replyMessageBodyWIndex - = (replyMessageBody ? [NSString stringWithFormat:@"%zd %@", index, replyMessageBody] : nil); - if (isReplyIncoming) { - [self createFakeIncomingMessage:thread - messageBody:replyMessageBodyWIndex - fakeAssetLoader:replyAssetLoader - isAttachmentDownloaded:NO - quotedMessage:quotedMessage - transaction:transaction]; - } else { - [self createFakeOutgoingMessage:thread - messageBody:replyMessageBodyWIndex - fakeAssetLoader:replyAssetLoader - messageState:replyMessageState - isDelivered:replyIsDelivered - isRead:replyIsRead - quotedMessage:quotedMessage - contactShare:nil - linkPreview:nil - transaction:transaction]; - } - } - prepareBlock:[self groupPrepareBlockWithPrepareBlocks:prepareBlocks]]; -} - -// Recursively perform a group of "prepare blocks" in sequence, aborting -// if any fail. -+ (ActionPrepareBlock)groupPrepareBlockWithPrepareBlocks:(NSArray *)prepareBlocks -{ - return ^(ActionSuccessBlock success, ActionFailureBlock failure) { - [self groupPrepareBlockStepWithPrepareBlocks:[prepareBlocks mutableCopy] success:success failure:failure]; - }; -} - -+ (void)groupPrepareBlockStepWithPrepareBlocks:(NSMutableArray *)prepareBlocks - success:(ActionSuccessBlock)success - failure:(ActionFailureBlock)failure -{ - if (prepareBlocks.count < 1) { - success(); - return; - } - ActionPrepareBlock nextPrepareBlock = [prepareBlocks lastObject]; - [prepareBlocks removeLastObject]; - - nextPrepareBlock( - ^{ - [self groupPrepareBlockStepWithPrepareBlocks:prepareBlocks success:success failure:failure]; - }, - failure); -} - -+ (NSArray *)allFakeQuotedReplyActions:(TSThread *)thread includeLabels:(BOOL)includeLabels -{ - OWSAssertDebug(thread); - - NSString *shortText = @"Lorem ipsum"; - NSString *mediumText = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, " - @"consectetur adipiscing elit."; - NSString *longText = [self randomOversizeText]; - - NSMutableArray *actions = [NSMutableArray new]; - - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread - text:@"⚠️ Quoted Replies (Message Lengths) ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Short Text" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:nil - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Short Text" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:nil - replyLabel:@"Medium Text" - isReplyIncoming:NO - replyMessageBody:mediumText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Medium Text" - isQuotedMessageIncoming:NO - quotedMessageBody:mediumText - quotedMessageAssetLoader:nil - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Medium Text" - isQuotedMessageIncoming:NO - quotedMessageBody:mediumText - quotedMessageAssetLoader:nil - replyLabel:@"Medium Text" - isReplyIncoming:NO - replyMessageBody:mediumText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Long Text" - isQuotedMessageIncoming:NO - quotedMessageBody:longText - quotedMessageAssetLoader:nil - replyLabel:@"Long Text" - isReplyIncoming:NO - replyMessageBody:longText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - ]]; - - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread - text:@"⚠️ Quoted Replies (Attachment Types) ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Jpg" - isQuotedMessageIncoming:NO - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader jpegInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Jpg" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader jpegInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Mp3" - isQuotedMessageIncoming:NO - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader mp3Instance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Mp3" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader mp3Instance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Mp4" - isQuotedMessageIncoming:NO - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader mp4Instance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Mp4" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader mp4Instance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Gif" - isQuotedMessageIncoming:NO - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader gifInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Gif" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader gifInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Pdf" - isQuotedMessageIncoming:YES - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader tinyPdfInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Missing Pdf" - isQuotedMessageIncoming:YES - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader missingPdfInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Tiny Png" - isQuotedMessageIncoming:YES - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader tinyPngInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Missing Png" - isQuotedMessageIncoming:YES - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader missingPngInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - ]]; - - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread - text:@"⚠️ Quoted Replies (Attachment Layout) ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Tall Portrait Png" - isQuotedMessageIncoming:NO - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader tallPortraitPngInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Tall Portrait Png" - isQuotedMessageIncoming:NO - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader tallPortraitPngInstance] - replyLabel:@"Medium Text" - isReplyIncoming:NO - replyMessageBody:mediumText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Tall Portrait Png" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader tallPortraitPngInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Wide Landscape Png" - isQuotedMessageIncoming:NO - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader wideLandscapePngInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Wide Landscape Png" - isQuotedMessageIncoming:NO - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader wideLandscapePngInstance] - replyLabel:@"Medium Text" - isReplyIncoming:NO - replyMessageBody:mediumText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Wide Landscape Png" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader wideLandscapePngInstance] - replyLabel:@"Medium Text" - isReplyIncoming:NO - replyMessageBody:mediumText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Tiny Png" - isQuotedMessageIncoming:YES - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader tinyPngInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Tiny Png" - isQuotedMessageIncoming:YES - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader tinyPngInstance] - replyLabel:@"Medium Text" - isReplyIncoming:NO - replyMessageBody:mediumText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - ]]; - - void (^directionActions)(BOOL, BOOL) = ^(BOOL isQuotedMessageIncoming, BOOL isReplyIncoming) { - [actions addObjectsFromArray:@[ - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Short Text" - isQuotedMessageIncoming:isQuotedMessageIncoming - quotedMessageBody:shortText - quotedMessageAssetLoader:nil - replyLabel:@"Short Text" - isReplyIncoming:isReplyIncoming - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - ]]; - }; - - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread - text:@"⚠️ Quoted Replies (Incoming v. Outgoing) ⚠️"]]; - } - directionActions(NO, NO); - directionActions(YES, NO); - directionActions(NO, YES); - directionActions(YES, YES); - - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread - text:@"⚠️ Quoted Replies (Message States) ⚠️"]]; - } - [actions addObjectsFromArray:@[ - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Jpg" - isQuotedMessageIncoming:YES - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader jpegInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Mp3" - isQuotedMessageIncoming:YES - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader mp3Instance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Mp4" - isQuotedMessageIncoming:YES - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader mp4Instance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Gif" - isQuotedMessageIncoming:YES - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader gifInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Pdf" - isQuotedMessageIncoming:YES - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader tinyPdfInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Missing Pdf" - isQuotedMessageIncoming:YES - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader missingPdfInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Tiny Png" - isQuotedMessageIncoming:YES - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader tinyPngInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Missing Png" - isQuotedMessageIncoming:YES - quotedMessageBody:nil - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader missingPngInstance] - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Short Text" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:nil - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSending], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Short Text" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:nil - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Short Text" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:nil - replyLabel:@"Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateFailed], - ]]; - - - if (includeLabels) { - [actions addObject:[self fakeIncomingTextMessageAction:thread - text:@"⚠️ Quoted Replies (Reply W. Attachment) ⚠️"]]; - } - [actions addObjectsFromArray:@[ - // Png + Text -> Png + Text - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Tall Portrait Png" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:[DebugUIMessagesAssetLoader tallPortraitPngInstance] - replyLabel:@"Tall Portrait Png" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:[DebugUIMessagesAssetLoader tallPortraitPngInstance] - replyMessageState:TSOutgoingMessageStateSent], - - // Text -> Png + Text - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Short Text" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:nil - replyLabel:@"Tall Portrait Png" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:nil - replyMessageState:TSOutgoingMessageStateSent], - - // Text -> Png - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Short Text" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:nil - replyLabel:@"Tall Portrait Png" - isReplyIncoming:NO - replyMessageBody:nil - replyAssetLoader:[DebugUIMessagesAssetLoader tallPortraitPngInstance] - replyMessageState:TSOutgoingMessageStateSent], - - // Png -> Png + Text - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Short Text" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:nil - replyLabel:@"Tall Portrait Png" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:[DebugUIMessagesAssetLoader tallPortraitPngInstance] - replyMessageState:TSOutgoingMessageStateSent], - - // Png -> Portrait Png + Text - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Short Text" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:nil - replyLabel:@"Tall Portrait Png" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:[DebugUIMessagesAssetLoader tallPortraitPngInstance] - replyMessageState:TSOutgoingMessageStateSent], - - // Png -> Landscape Png + Text - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Short Text" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:nil - replyLabel:@"Wide Landscape Png" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:[DebugUIMessagesAssetLoader wideLandscapePngInstance] - replyMessageState:TSOutgoingMessageStateSent], - - - // Png -> Landscape Png + Text - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Short Text" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:nil - replyLabel:@"Wide Landscape Png + Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:[DebugUIMessagesAssetLoader wideLandscapePngInstance] - replyMessageState:TSOutgoingMessageStateSent], - - // Png -> Landscape Png + Text - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Short Text" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:nil - replyLabel:@"Wide Landscape Png + Short Text" - isReplyIncoming:NO - replyMessageBody:shortText - replyAssetLoader:[DebugUIMessagesAssetLoader wideLandscapePngInstance] - replyMessageState:TSOutgoingMessageStateSent], - - // Png -> Landscape Png + Text - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Short Text" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:nil - replyLabel:@"Wide Landscape Png + Medium Text" - isReplyIncoming:NO - replyMessageBody:mediumText - replyAssetLoader:[DebugUIMessagesAssetLoader wideLandscapePngInstance] - replyMessageState:TSOutgoingMessageStateSent], - - // Png -> Landscape Png + Text - [self fakeQuotedReplyAction:thread - quotedMessageLabel:@"Short Text" - isQuotedMessageIncoming:NO - quotedMessageBody:shortText - quotedMessageAssetLoader:nil - replyLabel:@"Wide Landscape Png + Medium Text" - isReplyIncoming:NO - replyMessageBody:mediumText - replyAssetLoader:[DebugUIMessagesAssetLoader wideLandscapePngInstance] - replyMessageState:TSOutgoingMessageStateSent], - ]]; - - return actions; -} - -+ (DebugUIMessagesAction *)allQuotedReplyAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - return - [DebugUIMessagesGroupAction allGroupActionWithLabel:@"All Quoted Reply" - subactions:[self allFakeQuotedReplyActions:thread includeLabels:YES]]; -} - -+ (void)selectQuotedReplyAction:(TSThread *)thread -{ - OWSAssertIsOnMainThread(); - OWSAssertDebug(thread); - - [self selectActionUI:[self allFakeQuotedReplyActions:thread includeLabels:NO] label:@"Select QuotedReply"]; -} - -+ (DebugUIMessagesAction *)randomQuotedReplyAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesGroupAction - randomGroupActionWithLabel:@"Random Quoted Reply" - subactions:[self allFakeQuotedReplyActions:thread includeLabels:NO]]; -} - -#pragma mark - Exemplary - -+ (NSArray *)allFakeActions:(TSThread *)thread includeLabels:(BOOL)includeLabels -{ - OWSAssertDebug(thread); - - NSMutableArray *actions = [NSMutableArray new]; - [actions addObjectsFromArray:[self allFakeMediaActions:thread includeLabels:includeLabels]]; - [actions addObjectsFromArray:[self allFakeTextActions:thread includeLabels:includeLabels]]; - [actions addObjectsFromArray:[self allFakeSequenceActions:thread includeLabels:includeLabels]]; - [actions addObjectsFromArray:[self allFakeQuotedReplyActions:thread includeLabels:includeLabels]]; - [actions addObjectsFromArray:[self allFakeBackDatedActions:thread includeLabels:includeLabels]]; - [actions addObjectsFromArray:[self allFakeContactShareActions:thread includeLabels:includeLabels]]; - return actions; -} - -+ (DebugUIMessagesAction *)allFakeAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesGroupAction allGroupActionWithLabel:@"All Fake" - subactions:[self allFakeActions:thread includeLabels:YES]]; -} - -+ (void)selectFakeAction:(TSThread *)thread -{ - OWSAssertIsOnMainThread(); - OWSAssertDebug(thread); - - [self selectActionUI:[self allFakeActions:thread includeLabels:NO] label:@"Select Fake"]; -} - -+ (void)selectActionUI:(NSArray *)actions label:(NSString *)label -{ - OWSAssertIsOnMainThread(); - UIAlertController *alert = - [UIAlertController alertControllerWithTitle:label message:nil preferredStyle:UIAlertControllerStyleActionSheet]; - for (DebugUIMessagesAction *action in actions) { - [alert addAction:[UIAlertAction actionWithTitle:action.label - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *ignore) { - [self performActionNTimes:action]; - }]]; - } - - [alert addAction:[OWSAlerts cancelAction]]; - - UIViewController *fromViewController = [[UIApplication sharedApplication] frontmostViewController]; - [fromViewController presentAlert:alert]; -} - -#pragma mark - Sequences - -+ (NSArray *)allFakeSequenceActions:(TSThread *)thread includeLabels:(BOOL)includeLabels -{ - OWSAssertDebug(thread); - - NSMutableArray *actions = [NSMutableArray new]; - - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Short Message Sequences ⚠️"]]; - } - - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"Incoming"]]; - [actions - addObject:[self fakeOutgoingTextMessageAction:thread messageState:TSOutgoingMessageStateSent text:@"Outgoing"]]; - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"Incoming 1"]]; - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"Incoming 2"]]; - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"Incoming 3"]]; - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateFailed - text:@"Outgoing Unsent 1"]]; - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateFailed - text:@"Outgoing Unsent 2"]]; - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSending - text:@"Outgoing Sending 1"]]; - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSending - text:@"Outgoing Sending 2"]]; - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"Outgoing Sent 1"]]; - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"Outgoing Sent 2"]]; - [actions addObject:[self fakeShortOutgoingTextMessageAction:thread - text:@"Outgoing Delivered 1" - messageState:TSOutgoingMessageStateSent - isDelivered:YES - isRead:NO]]; - [actions addObject:[self fakeShortOutgoingTextMessageAction:thread - text:@"Outgoing Delivered 2" - messageState:TSOutgoingMessageStateSent - isDelivered:YES - isRead:NO]]; - [actions addObject:[self fakeShortOutgoingTextMessageAction:thread - text:@"Outgoing Read 1" - messageState:TSOutgoingMessageStateSent - isDelivered:YES - isRead:YES]]; - [actions addObject:[self fakeShortOutgoingTextMessageAction:thread - text:@"Outgoing Read 2" - messageState:TSOutgoingMessageStateSent - isDelivered:YES - isRead:YES]]; - [actions addObject:[self fakeIncomingTextMessageAction:thread text:@"Incoming"]]; - - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Long Message Sequences ⚠️"]]; - } - - NSString *longText = @"\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse rutrum, nulla " - @"vitae pretium hendrerit, tellus turpis pharetra libero..."; - - [actions addObject:[self fakeIncomingTextMessageAction:thread text:[@"Incoming" stringByAppendingString:longText]]]; - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:[@"Outgoing" stringByAppendingString:longText]]]; - [actions - addObject:[self fakeIncomingTextMessageAction:thread text:[@"Incoming 1" stringByAppendingString:longText]]]; - [actions - addObject:[self fakeIncomingTextMessageAction:thread text:[@"Incoming 2" stringByAppendingString:longText]]]; - [actions - addObject:[self fakeIncomingTextMessageAction:thread text:[@"Incoming 3" stringByAppendingString:longText]]]; - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateFailed - text:[@"Outgoing Unsent 1" stringByAppendingString:longText]]]; - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateFailed - text:[@"Outgoing Unsent 2" stringByAppendingString:longText]]]; - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSending - text:[@"Outgoing Sending 1" stringByAppendingString:longText]]]; - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSending - text:[@"Outgoing Sending 2" stringByAppendingString:longText]]]; - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:[@"Outgoing Sent 1" stringByAppendingString:longText]]]; - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:[@"Outgoing Sent 2" stringByAppendingString:longText]]]; - [actions - addObject:[self fakeShortOutgoingTextMessageAction:thread - text:[@"Outgoing Delivered 1" stringByAppendingString:longText] - messageState:TSOutgoingMessageStateSent - isDelivered:YES - isRead:NO]]; - [actions - addObject:[self fakeShortOutgoingTextMessageAction:thread - text:[@"Outgoing Delivered 2" stringByAppendingString:longText] - messageState:TSOutgoingMessageStateSent - isDelivered:YES - isRead:NO]]; - [actions addObject:[self fakeShortOutgoingTextMessageAction:thread - text:[@"Outgoing Read 1" stringByAppendingString:longText] - messageState:TSOutgoingMessageStateSent - isDelivered:YES - isRead:YES]]; - [actions addObject:[self fakeShortOutgoingTextMessageAction:thread - text:[@"Outgoing Read 2" stringByAppendingString:longText] - messageState:TSOutgoingMessageStateSent - isDelivered:YES - isRead:YES]]; - [actions addObject:[self fakeIncomingTextMessageAction:thread text:[@"Incoming" stringByAppendingString:longText]]]; - - return actions; -} - -+ (DebugUIMessagesAction *)allFakeSequencesAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesGroupAction allGroupActionWithLabel:@"All Fake Sequences" - subactions:[self allFakeSequenceActions:thread includeLabels:YES]]; -} - -#pragma mark - Back-dated - -+ (DebugUIMessagesAction *)fakeBackDatedMessageAction:(TSThread *)thread - label:(NSString *)label - dateOffset:(int64_t)dateOffset -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesSingleAction - actionWithLabel:[NSString stringWithFormat:@"Fake Back-Date Message (%@)", label] - unstaggeredActionBlock:^(NSUInteger index, YapDatabaseReadWriteTransaction *transaction) { - NSString *messageBody = - [[@(index).stringValue stringByAppendingString:@" "] stringByAppendingString:self.randomText]; - TSOutgoingMessage *message = [self createFakeOutgoingMessage:thread - messageBody:messageBody - fakeAssetLoader:nil - messageState:TSOutgoingMessageStateSent - isDelivered:NO - isRead:NO - quotedMessage:nil - contactShare:nil - linkPreview:nil - transaction:transaction]; - [message setReceivedAtTimestamp:(uint64_t)((int64_t)[NSDate ows_millisecondTimeStamp] + dateOffset)]; - [message saveWithTransaction:transaction]; - }]; -} - -+ (NSArray *)allFakeBackDatedActions:(TSThread *)thread includeLabels:(BOOL)includeLabels -{ - OWSAssertDebug(thread); - - NSMutableArray *actions = [NSMutableArray new]; - - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Back-Dated ⚠️"]]; - } - - [actions - addObject:[self fakeBackDatedMessageAction:thread label:@"One Minute Ago" dateOffset:-(int64_t)kMinuteInMs]]; - [actions addObject:[self fakeBackDatedMessageAction:thread label:@"One Hour Ago" dateOffset:-(int64_t)kHourInMs]]; - [actions addObject:[self fakeBackDatedMessageAction:thread label:@"One Day Ago" dateOffset:-(int64_t)kDayInMs]]; - [actions - addObject:[self fakeBackDatedMessageAction:thread label:@"Two Days Ago" dateOffset:-(int64_t)kDayInMs * 2]]; - [actions - addObject:[self fakeBackDatedMessageAction:thread label:@"Ten Days Ago" dateOffset:-(int64_t)kDayInMs * 10]]; - [actions - addObject:[self fakeBackDatedMessageAction:thread label:@"400 Days Ago" dateOffset:-(int64_t)kDayInMs * 400]]; - - return actions; -} - -+ (DebugUIMessagesAction *)allFakeBackDatedAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesGroupAction allGroupActionWithLabel:@"All Fake Back-Dated" - subactions:[self allFakeBackDatedActions:thread includeLabels:YES]]; -} - -+ (void)selectBackDatedAction:(TSThread *)thread -{ - OWSAssertIsOnMainThread(); - OWSAssertDebug(thread); - - [self selectActionUI:[self allFakeBackDatedActions:thread includeLabels:NO] label:@"Select Back-Dated"]; -} - -#pragma mark - Contact Shares - -typedef OWSContact * (^OWSContactBlock)(YapDatabaseReadWriteTransaction *transaction); - -+ (DebugUIMessagesAction *)fakeContactShareMessageAction:(TSThread *)thread - label:(NSString *)label - contactBlock:(OWSContactBlock)contactBlock -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesSingleAction - actionWithLabel:[NSString stringWithFormat:@"Fake Contact Share (%@)", label] - unstaggeredActionBlock:^(NSUInteger index, YapDatabaseReadWriteTransaction *transaction) { - OWSContact *contact = contactBlock(transaction); - TSOutgoingMessage *message = [self createFakeOutgoingMessage:thread - messageBody:nil - fakeAssetLoader:nil - messageState:TSOutgoingMessageStateSent - isDelivered:NO - isRead:NO - quotedMessage:nil - contactShare:contact - linkPreview:nil - transaction:transaction]; - [message saveWithTransaction:transaction]; - }]; -} - -+ (NSArray *)allFakeContactShareActions:(TSThread *)thread includeLabels:(BOOL)includeLabels -{ - OWSAssertDebug(thread); - - NSMutableArray *actions = [NSMutableArray new]; - - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Share Contact ⚠️"]]; - } - - [actions addObject:[self fakeContactShareMessageAction:thread - label:@"Name & Number" - contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { - OWSContact *contact = [OWSContact new]; - OWSContactName *name = [OWSContactName new]; - contact.name = name; - name.givenName = @"Alice"; - OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new]; - phoneNumber.phoneType = OWSContactPhoneType_Home; - phoneNumber.phoneNumber = @"+13213214321"; - contact.phoneNumbers = @[ - phoneNumber, - ]; - return contact; - }]]; - [actions addObject:[self fakeContactShareMessageAction:thread - label:@"Name & Email" - contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { - OWSContact *contact = [OWSContact new]; - OWSContactName *name = [OWSContactName new]; - contact.name = name; - name.givenName = @"Bob"; - OWSContactEmail *email = [OWSContactEmail new]; - email.emailType = OWSContactEmailType_Home; - email.email = @"a@b.com"; - contact.emails = @[ - email, - ]; - return contact; - }]]; - [actions addObject:[self fakeContactShareMessageAction:thread - label:@"Complicated" - contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { - OWSContact *contact = [OWSContact new]; - OWSContactName *name = [OWSContactName new]; - contact.name = name; - name.givenName = @"Alice"; - name.familyName = @"Carol"; - name.middleName = @"Bob"; - name.namePrefix = @"Ms."; - name.nameSuffix = @"Esq."; - name.organizationName = @"Falafel Hut"; - - OWSContactPhoneNumber *phoneNumber1 = [OWSContactPhoneNumber new]; - phoneNumber1.phoneType = OWSContactPhoneType_Home; - phoneNumber1.phoneNumber = @"+13213215555"; - OWSContactPhoneNumber *phoneNumber2 = [OWSContactPhoneNumber new]; - phoneNumber2.phoneType = OWSContactPhoneType_Custom; - phoneNumber2.label = @"Carphone"; - phoneNumber2.phoneNumber = @"+13332226666"; - contact.phoneNumbers = @[ - phoneNumber1, - phoneNumber2, - ]; - - NSMutableArray *emails = [NSMutableArray new]; - for (NSUInteger i = 0; i < 16; i++) { - OWSContactEmail *email = [OWSContactEmail new]; - email.emailType = OWSContactEmailType_Home; - email.email = [NSString stringWithFormat:@"a%zd@b.com", i]; - [emails addObject:email]; - } - contact.emails = emails; - - OWSContactAddress *address1 = [OWSContactAddress new]; - address1.addressType = OWSContactAddressType_Home; - address1.street = @"123 home st."; - address1.neighborhood = @"round the bend."; - address1.city = @"homeville"; - address1.region = @"HO"; - address1.postcode = @"12345"; - address1.country = @"USA"; - OWSContactAddress *address2 = [OWSContactAddress new]; - address2.addressType = OWSContactAddressType_Custom; - address2.label = @"Otra casa"; - address2.pobox = @"caja 123"; - address2.street = @"123 casa calle"; - address2.city = @"barrio norte"; - address2.region = @"AB"; - address2.postcode = @"53421"; - address2.country = @"MX"; - contact.addresses = @[ - address1, - address2, - ]; - - UIImage *avatarImage = - [OWSAvatarBuilder buildRandomAvatarWithDiameter:200]; - [contact saveAvatarImage:avatarImage transaction:transaction]; - - return contact; - }]]; - [actions addObject:[self fakeContactShareMessageAction:thread - label:@"Long values" - contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { - OWSContact *contact = [OWSContact new]; - OWSContactName *name = [OWSContactName new]; - contact.name = name; - name.givenName = @"Bobasdjasdlkjasldkjas"; - name.familyName = @"Bobasdjasdlkjasldkjas"; - OWSContactEmail *email = [OWSContactEmail new]; - email.emailType = OWSContactEmailType_Mobile; - email.email = @"asdlakjsaldkjasldkjasdlkjasdlkjasdlkajsa@b.com"; - contact.emails = @[ - email, - ]; - return contact; - }]]; - [actions addObject:[self fakeContactShareMessageAction:thread - label:@"System Contact w/o Signal" - contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { - OWSContact *contact = [OWSContact new]; - OWSContactName *name = [OWSContactName new]; - contact.name = name; - name.givenName = @"Add Me To Your Contacts"; - OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new]; - phoneNumber.phoneType = OWSContactPhoneType_Work; - phoneNumber.phoneNumber = @"+324602053911"; - contact.phoneNumbers = @[ - phoneNumber, - ]; - return contact; - }]]; - [actions addObject:[self fakeContactShareMessageAction:thread - label:@"System Contact w. Signal" - contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { - OWSContact *contact = [OWSContact new]; - OWSContactName *name = [OWSContactName new]; - contact.name = name; - name.givenName = @"Add Me To Your Contacts"; - OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new]; - phoneNumber.phoneType = OWSContactPhoneType_Work; - phoneNumber.phoneNumber = @"+32460205392"; - contact.phoneNumbers = @[ - phoneNumber, - ]; - return contact; - }]]; - - return actions; -} - -+ (DebugUIMessagesAction *)fakeAllContactShareAction:(TSThread *)thread -{ - OWSAssertDebug(thread); - - return - [DebugUIMessagesGroupAction allGroupActionWithLabel:@"All Fake Contact Shares" - subactions:[self allFakeContactShareActions:thread includeLabels:YES]]; -} - - -+ (DebugUIMessagesAction *)sendContactShareMessageAction:(TSThread *)thread - label:(NSString *)label - contactBlock:(OWSContactBlock)contactBlock -{ - OWSAssertDebug(thread); - - return [DebugUIMessagesSingleAction - actionWithLabel:[NSString stringWithFormat:@"Send Contact Share (%@)", label] - staggeredActionBlock:^(NSUInteger index, - YapDatabaseReadWriteTransaction *transaction, - ActionSuccessBlock success, - ActionFailureBlock failure) { - OWSContact *contact = contactBlock(transaction); - OWSLogVerbose(@"sending contact: %@", contact.debugDescription); - [ThreadUtil enqueueMessageWithContactShare:contact inThread:thread]; - - success(); - }]; -} - -+ (NSArray *)allSendContactShareActions:(TSThread *)thread includeLabels:(BOOL)includeLabels -{ - OWSAssertDebug(thread); - - NSMutableArray *actions = [NSMutableArray new]; - - if (includeLabels) { - [actions addObject:[self fakeOutgoingTextMessageAction:thread - messageState:TSOutgoingMessageStateSent - text:@"⚠️ Send Share Contact ⚠️"]]; - } - - [actions addObject:[self sendContactShareMessageAction:thread - label:@"Name & Number" - contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { - OWSContact *contact = [OWSContact new]; - OWSContactName *name = [OWSContactName new]; - contact.name = name; - name.givenName = @"Alice"; - OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new]; - phoneNumber.phoneType = OWSContactPhoneType_Home; - phoneNumber.phoneNumber = @"+13213214321"; - contact.phoneNumbers = @[ - phoneNumber, - ]; - return contact; - }]]; - [actions addObject:[self sendContactShareMessageAction:thread - label:@"Name & Email" - contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { - OWSContact *contact = [OWSContact new]; - OWSContactName *name = [OWSContactName new]; - contact.name = name; - name.givenName = @"Bob"; - OWSContactEmail *email = [OWSContactEmail new]; - email.emailType = OWSContactEmailType_Home; - email.email = @"a@b.com"; - contact.emails = @[ - email, - ]; - return contact; - }]]; - [actions addObject:[self sendContactShareMessageAction:thread - label:@"Complicated" - contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { - OWSContact *contact = [OWSContact new]; - OWSContactName *name = [OWSContactName new]; - contact.name = name; - name.givenName = @"Alice"; - name.familyName = @"Carol"; - name.middleName = @"Bob"; - name.namePrefix = @"Ms."; - name.nameSuffix = @"Esq."; - name.organizationName = @"Falafel Hut"; - - OWSContactPhoneNumber *phoneNumber1 = [OWSContactPhoneNumber new]; - phoneNumber1.phoneType = OWSContactPhoneType_Home; - phoneNumber1.phoneNumber = @"+13213214321"; - OWSContactPhoneNumber *phoneNumber2 = [OWSContactPhoneNumber new]; - phoneNumber2.phoneType = OWSContactPhoneType_Custom; - phoneNumber2.label = @"Carphone"; - phoneNumber2.phoneNumber = @"+13332221111"; - contact.phoneNumbers = @[ - phoneNumber1, - phoneNumber2, - ]; - - NSMutableArray *emails = [NSMutableArray new]; - for (NSUInteger i = 0; i < 16; i++) { - OWSContactEmail *email = [OWSContactEmail new]; - email.emailType = OWSContactEmailType_Home; - email.email = [NSString stringWithFormat:@"a%zd@b.com", i]; - [emails addObject:email]; - } - contact.emails = emails; - - OWSContactAddress *address1 = [OWSContactAddress new]; - address1.addressType = OWSContactAddressType_Home; - address1.street = @"123 home st."; - address1.neighborhood = @"round the bend."; - address1.city = @"homeville"; - address1.region = @"HO"; - address1.postcode = @"12345"; - address1.country = @"USA"; - OWSContactAddress *address2 = [OWSContactAddress new]; - address2.addressType = OWSContactAddressType_Custom; - address2.label = @"Otra casa"; - address2.pobox = @"caja 123"; - address2.street = @"123 casa calle"; - address2.city = @"barrio norte"; - address2.region = @"AB"; - address2.postcode = @"53421"; - address2.country = @"MX"; - contact.addresses = @[ - address1, - address2, - ]; - - UIImage *avatarImage = - [OWSAvatarBuilder buildRandomAvatarWithDiameter:200]; - [contact saveAvatarImage:avatarImage transaction:transaction]; - - return contact; - }]]; - [actions addObject:[self sendContactShareMessageAction:thread - label:@"Long values" - contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { - OWSContact *contact = [OWSContact new]; - OWSContactName *name = [OWSContactName new]; - contact.name = name; - name.givenName = @"Bobasdjasdlkjasldkjas"; - name.familyName = @"Bobasdjasdlkjasldkjas"; - OWSContactEmail *email = [OWSContactEmail new]; - email.emailType = OWSContactEmailType_Mobile; - email.email = @"asdlakjsaldkjasldkjasdlkjasdlkjasdlkajsa@b.com"; - contact.emails = @[ - email, - ]; - return contact; - }]]; - [actions addObject:[self sendContactShareMessageAction:thread - label:@"System Contact w/o Signal" - contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { - OWSContact *contact = [OWSContact new]; - OWSContactName *name = [OWSContactName new]; - contact.name = name; - name.givenName = @"Add Me To Your Contacts"; - OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new]; - phoneNumber.phoneType = OWSContactPhoneType_Work; - phoneNumber.phoneNumber = @"+324602053911"; - contact.phoneNumbers = @[ - phoneNumber, - ]; - return contact; - }]]; - [actions addObject:[self sendContactShareMessageAction:thread - label:@"System Contact w. Signal" - contactBlock:^(YapDatabaseReadWriteTransaction *transaction) { - OWSContact *contact = [OWSContact new]; - OWSContactName *name = [OWSContactName new]; - contact.name = name; - name.givenName = @"Add Me To Your Contacts"; - OWSContactPhoneNumber *phoneNumber = [OWSContactPhoneNumber new]; - phoneNumber.phoneType = OWSContactPhoneType_Work; - phoneNumber.phoneNumber = @"+32460205392"; - contact.phoneNumbers = @[ - phoneNumber, - ]; - return contact; - }]]; - - return actions; -} - -+ (void)sendAllContacts:(TSThread *)thread -{ - NSArray *subactions = [self allSendContactShareActions:thread includeLabels:NO]; - DebugUIMessagesAction *action = - [DebugUIMessagesGroupAction allGroupActionWithLabel:@"Send All Contact Shares" subactions:subactions]; - [action prepareAndPerformNTimes:subactions.count]; -} - -#pragma mark - - -+ (NSString *)randomOversizeText -{ - NSMutableString *message = [NSMutableString new]; - while (message.length < kOversizeTextMessageSizeThreshold) { - [message appendString:@"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse rutrum, nulla " - @"vitae pretium hendrerit, tellus turpis pharetra libero, vitae sodales tortor ante vel " - @"sem. Fusce sed nisl a lorem gravida tincidunt. Suspendisse efficitur non quam ac " - @"sodales. Aenean ut velit maximus, posuere sem a, accumsan nunc. Donec ullamcorper " - @"turpis lorem. Quisque dignissim purus eu placerat ultricies. Proin at urna eget mi " - @"semper congue. Aenean non elementum ex. Praesent pharetra quam at sem vestibulum, " - @"vestibulum ornare dolor elementum. Vestibulum massa tortor, scelerisque sit amet " - @"pulvinar a, rhoncus vitae nisl. Sed mi nunc, tempus at varius in, malesuada vitae " - @"dui. Vivamus efficitur pulvinar erat vitae congue. Proin vehicula turpis non felis " - @"congue facilisis. Nullam aliquet dapibus ligula ac mollis. Etiam sit amet posuere " - @"lorem, in rhoncus nisi.\n\n"]; - } - return message; -} - -+ (void)sendOversizeTextMessage:(TSThread *)thread -{ - [self sendAttachment:nil thread:thread messageBody:[self randomOversizeText]]; -} - -+ (NSData *)createRandomNSDataOfSize:(size_t)size -{ - OWSAssertDebug(size % 4 == 0); - OWSAssertDebug(size < INT_MAX); - - return [Randomness generateRandomBytes:(int)size]; -} - -+ (void)sendRandomAttachment:(TSThread *)thread uti:(NSString *)uti -{ - [self sendRandomAttachment:thread uti:uti length:256]; -} - -+ (NSString *)randomCaptionText -{ - return [NSString stringWithFormat:@"%@ (caption)", [self randomText]]; -} - -+ (void)sendRandomAttachment:(TSThread *)thread uti:(NSString *)uti length:(NSUInteger)length -{ - DataSource *_Nullable dataSource = - [DataSourceValue dataSourceWithData:[self createRandomNSDataOfSize:length] utiType:uti]; - SignalAttachment *attachment = - [SignalAttachment attachmentWithDataSource:dataSource dataUTI:uti imageQuality:TSImageQualityOriginal]; - - if (arc4random_uniform(100) > 50) { - // give 1/2 our attachments captions, and add a hint that it's a caption since we - // style them indistinguishably from a separate text message. - attachment.captionText = [self randomCaptionText]; - } - [self sendAttachment:attachment thread:thread messageBody:nil]; -} - -+ (SSKProtoEnvelope *)createEnvelopeForThread:(TSThread *)thread -{ - OWSAssertDebug(thread); - - uint64_t timestamp = [NSDate ows_millisecondTimeStamp]; - NSString *source = ^{ - if ([thread isKindOfClass:[TSGroupThread class]]) { - TSGroupThread *gThread = (TSGroupThread *)thread; - return gThread.groupModel.groupMemberIds[0]; - } else if ([thread isKindOfClass:[TSContactThread class]]) { - TSContactThread *contactThread = (TSContactThread *)thread; - return contactThread.contactIdentifier; - } else { - OWSFailDebug(@"failure: unknown thread type"); - return @"unknown-source-id"; - } - }(); - - SSKProtoEnvelopeBuilder *envelopeBuilder = [SSKProtoEnvelope builderWithType:SSKProtoEnvelopeTypeCiphertext - timestamp:timestamp]; - [envelopeBuilder setSource:source]; - [envelopeBuilder setSourceDevice:1]; - NSError *error; - SSKProtoEnvelope *_Nullable envelope = [envelopeBuilder buildAndReturnError:&error]; - if (error || !envelope) { - OWSFailDebug(@"Could not construct envelope: %@.", error); - return nil; - } - return envelope; -} - -+ (NSArray *)unsavedSystemMessagesInThread:(TSThread *)thread -{ - OWSAssertDebug(thread); - - NSMutableArray *result = [NSMutableArray new]; - - [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - if ([thread isKindOfClass:[TSContactThread class]]) { - TSContactThread *contactThread = (TSContactThread *)thread; - - [result addObject:[[TSCall alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - withCallNumber:@"+19174054215" - callType:RPRecentCallTypeIncoming - inThread:contactThread]]; - [result addObject:[[TSCall alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - withCallNumber:@"+19174054215" - callType:RPRecentCallTypeOutgoing - inThread:contactThread]]; - [result addObject:[[TSCall alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - withCallNumber:@"+19174054215" - callType:RPRecentCallTypeIncomingMissed - inThread:contactThread]]; - [result addObject:[[TSCall alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - withCallNumber:@"+19174054215" - callType:RPRecentCallTypeIncomingMissedBecauseOfChangedIdentity - inThread:contactThread]]; - [result addObject:[[TSCall alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - withCallNumber:@"+19174054215" - callType:RPRecentCallTypeOutgoingIncomplete - inThread:contactThread]]; - [result addObject:[[TSCall alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - withCallNumber:@"+19174054215" - callType:RPRecentCallTypeIncomingIncomplete - inThread:contactThread]]; - [result addObject:[[TSCall alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - withCallNumber:@"+19174054215" - callType:RPRecentCallTypeIncomingDeclined - inThread:contactThread]]; - [result addObject:[[TSCall alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - withCallNumber:@"+19174054215" - callType:RPRecentCallTypeOutgoingMissed - inThread:contactThread]]; - } - - { - NSNumber *durationSeconds = [OWSDisappearingMessagesConfiguration validDurationsSeconds][0]; - OWSDisappearingMessagesConfiguration *disappearingMessagesConfiguration = - [[OWSDisappearingMessagesConfiguration alloc] initWithThreadId:thread.uniqueId - enabled:YES - durationSeconds:(uint32_t)[durationSeconds intValue]]; - // MJK - should be safe to remove this senderTimestamp - [result addObject:[[OWSDisappearingConfigurationUpdateInfoMessage alloc] - initWithTimestamp:[NSDate ows_millisecondTimeStamp] - thread:thread - configuration:disappearingMessagesConfiguration - createdByRemoteName:@"Alice" - createdInExistingGroup:NO]]; - } - - { - NSNumber *durationSeconds = [OWSDisappearingMessagesConfiguration validDurationsSeconds][0]; - OWSDisappearingMessagesConfiguration *disappearingMessagesConfiguration = - [[OWSDisappearingMessagesConfiguration alloc] initWithThreadId:thread.uniqueId - enabled:YES - durationSeconds:(uint32_t)[durationSeconds intValue]]; - // MJK - should be safe to remove this senderTimestamp - [result addObject:[[OWSDisappearingConfigurationUpdateInfoMessage alloc] - initWithTimestamp:[NSDate ows_millisecondTimeStamp] - thread:thread - configuration:disappearingMessagesConfiguration - createdByRemoteName:nil - createdInExistingGroup:YES]]; - } - - { - NSNumber *durationSeconds = [[OWSDisappearingMessagesConfiguration validDurationsSeconds] lastObject]; - OWSDisappearingMessagesConfiguration *disappearingMessagesConfiguration = - [[OWSDisappearingMessagesConfiguration alloc] initWithThreadId:thread.uniqueId - enabled:YES - durationSeconds:(uint32_t)[durationSeconds intValue]]; - // MJK TODO - remove senderTimestamp - [result addObject:[[OWSDisappearingConfigurationUpdateInfoMessage alloc] - initWithTimestamp:[NSDate ows_millisecondTimeStamp] - thread:thread - configuration:disappearingMessagesConfiguration - createdByRemoteName:@"Alice" - createdInExistingGroup:NO]]; - } - { - OWSDisappearingMessagesConfiguration *disappearingMessagesConfiguration = - [[OWSDisappearingMessagesConfiguration alloc] initWithThreadId:thread.uniqueId - enabled:NO - durationSeconds:0]; - // MJK TODO - remove senderTimestamp - [result addObject:[[OWSDisappearingConfigurationUpdateInfoMessage alloc] - initWithTimestamp:[NSDate ows_millisecondTimeStamp] - thread:thread - configuration:disappearingMessagesConfiguration - createdByRemoteName:@"Alice" - createdInExistingGroup:NO]]; - } - - [result addObject:[TSInfoMessage userNotRegisteredMessageInThread:thread recipientId:@"+19174054215"]]; - - // MJK - should be safe to remove this senderTimestamp - [result addObject:[[TSInfoMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - inThread:thread - messageType:TSInfoMessageTypeSessionDidEnd]]; - // TODO: customMessage? - // MJK - should be safe to remove this senderTimestamp - [result addObject:[[TSInfoMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - inThread:thread - messageType:TSInfoMessageTypeGroupUpdate]]; - // TODO: customMessage? - // MJK - should be safe to remove this senderTimestamp - [result addObject:[[TSInfoMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - inThread:thread - messageType:TSInfoMessageTypeGroupQuit]]; - - // MJK - should be safe to remove this senderTimestamp - [result addObject:[[OWSVerificationStateChangeMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - thread:thread - recipientId:@"+19174054215" - verificationState:OWSVerificationStateDefault - isLocalChange:YES]]; - - // MJK - should be safe to remove this senderTimestamp - [result addObject:[[OWSVerificationStateChangeMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - thread:thread - recipientId:@"+19174054215" - verificationState:OWSVerificationStateVerified - isLocalChange:YES]]; - // MJK - should be safe to remove this senderTimestamp - [result - addObject:[[OWSVerificationStateChangeMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - thread:thread - recipientId:@"+19174054215" - verificationState:OWSVerificationStateNoLongerVerified - isLocalChange:YES]]; - - // MJK - should be safe to remove this senderTimestamp - [result addObject:[[OWSVerificationStateChangeMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - thread:thread - recipientId:@"+19174054215" - verificationState:OWSVerificationStateDefault - isLocalChange:NO]]; - // MJK - should be safe to remove this senderTimestamp - [result addObject:[[OWSVerificationStateChangeMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - thread:thread - recipientId:@"+19174054215" - verificationState:OWSVerificationStateVerified - isLocalChange:NO]]; - // MJK - should be safe to remove this senderTimestamp - [result - addObject:[[OWSVerificationStateChangeMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - thread:thread - recipientId:@"+19174054215" - verificationState:OWSVerificationStateNoLongerVerified - isLocalChange:NO]]; - - [result addObject:[TSErrorMessage missingSessionWithEnvelope:[self createEnvelopeForThread:thread] - withTransaction:transaction]]; - [result addObject:[TSErrorMessage invalidKeyExceptionWithEnvelope:[self createEnvelopeForThread:thread] - withTransaction:transaction]]; - [result addObject:[TSErrorMessage invalidVersionWithEnvelope:[self createEnvelopeForThread:thread] - withTransaction:transaction]]; - [result addObject:[TSErrorMessage corruptedMessageWithEnvelope:[self createEnvelopeForThread:thread] - withTransaction:transaction]]; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - TSInvalidIdentityKeyReceivingErrorMessage *_Nullable blockingSNChangeMessage = - [TSInvalidIdentityKeyReceivingErrorMessage untrustedKeyWithEnvelope:[self createEnvelopeForThread:thread] - withTransaction:transaction]; -#pragma clang diagnostic pop - - OWSAssertDebug(blockingSNChangeMessage); - [result addObject:blockingSNChangeMessage]; - // MJK TODO - should be safe to remove this senderTimestamp - [result addObject:[[TSErrorMessage alloc] initWithTimestamp:[NSDate ows_millisecondTimeStamp] - inThread:thread - failedMessageType:TSErrorMessageNonBlockingIdentityChange - recipientId:@"+19174054215"]]; - }]; - - return result; -} - -+ (void)createSystemMessagesInThread:(TSThread *)thread -{ - OWSAssertDebug(thread); - - NSArray *messages = [self unsavedSystemMessagesInThread:thread]; - [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - for (TSInteraction *message in messages) { - [message saveWithTransaction:transaction]; - } - }]; -} - -+ (void)createSystemMessageInThread:(TSThread *)thread -{ - OWSAssertDebug(thread); - - NSArray *messages = [self unsavedSystemMessagesInThread:thread]; - TSInteraction *message = messages[(NSUInteger)arc4random_uniform((uint32_t)messages.count)]; - [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [message saveWithTransaction:transaction]; - }]; -} - -+ (void)sendTextAndSystemMessages:(NSUInteger)counter thread:(TSThread *)thread -{ - if (counter < 1) { - return; - } - if (arc4random_uniform(2) == 0) { - [self sendTextMessageInThread:thread counter:counter]; - } else { - [self createSystemMessageInThread:thread]; - } - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)1.f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ - [self sendTextAndSystemMessages:counter - 1 thread:thread]; - }); -} - -+ (NSString *)randomText -{ - NSArray *randomTexts = @[ - @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. ", - (@"Lorem ipsum dolor sit amet, consectetur adipiscing elit. " - @"Suspendisse rutrum, nulla vitae pretium hendrerit, tellus " - @"turpis pharetra libero, vitae sodales tortor ante vel sem."), - @"In a time of universal deceit - telling the truth is a revolutionary act.", - @"If you want a vision of the future, imagine a boot stamping on a human face - forever.", - @"Who controls the past controls the future. Who controls the present controls the past.", - @"All animals are equal, but some animals are more equal than others.", - @"War is peace. Freedom is slavery. Ignorance is strength.", - (@"All the war-propaganda, all the screaming and lies and hatred, comes invariably from people who are not " - @"fighting."), - (@"Political language. . . is designed to make lies sound truthful and murder respectable, and to give an " - @"appearance of solidity to pure wind."), - (@"The nationalist not only does not disapprove of atrocities committed by his own side, but he has a " - @"remarkable capacity for not even hearing about them."), - (@"Every generation imagines itself to be more intelligent than the one that went before it, and wiser than " - @"the " - @"one that comes after it."), - @"War against a foreign country only happens when the moneyed classes think they are going to profit from it.", - @"People have only as much liberty as they have the intelligence to want and the courage to take.", - (@"You cannot buy the revolution. You cannot make the revolution. You can only be the revolution. It is in your " - @"spirit, or it is nowhere."), - (@"That is what I have always understood to be the essence of anarchism: the conviction that the burden of " - @"proof has to be placed on authority, and that it should be dismantled if that burden cannot be met."), - (@"Ask for work. If they don't give you work, ask for bread. If they do not give you work or bread, then take " - @"bread."), - @"Every society has the criminals it deserves.", - (@"Anarchism is founded on the observation that since few men are wise enough to rule themselves, even fewer " - @"are wise enough to rule others."), - @"If you would know who controls you see who you may not criticise.", - @"At one time in the world there were woods that no one owned." - ]; - NSString *randomText = randomTexts[(NSUInteger)arc4random_uniform((uint32_t)randomTexts.count)]; - return randomText; -} - -+ (void)createFakeThreads:(NSUInteger)threadCount withFakeMessages:(NSUInteger)messageCount -{ - [DebugContactsUtils - createRandomContacts:threadCount - contactHandler:^(CNContact *_Nonnull contact, NSUInteger idx, BOOL *_Nonnull stop) { - NSString *phoneNumberText = contact.phoneNumbers.firstObject.value.stringValue; - OWSAssertDebug(phoneNumberText); - PhoneNumber *phoneNumber = [PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:phoneNumberText]; - OWSAssertDebug(phoneNumber); - OWSAssertDebug(phoneNumber.toE164); - - TSContactThread *contactThread = [TSContactThread getOrCreateThreadWithContactId:phoneNumber.toE164]; - [self sendFakeMessages:messageCount thread:contactThread]; - OWSLogError(@"Create fake thread: %@, interactions: %lu", - phoneNumber.toE164, - (unsigned long)contactThread.numberOfInteractions); - }]; -} - -+ (void)sendFakeMessages:(NSUInteger)counter thread:(TSThread *)thread -{ - [self sendFakeMessages:counter thread:thread isTextOnly:NO]; -} - -+ (void)sendFakeMessages:(NSUInteger)counter thread:(TSThread *)thread isTextOnly:(BOOL)isTextOnly -{ - const NSUInteger kMaxBatchSize = 2500; - if (counter < kMaxBatchSize) { - [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [self sendFakeMessages:counter thread:thread isTextOnly:isTextOnly transaction:transaction]; - }]; - } else { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - NSUInteger remainder = counter; - while (remainder > 0) { - NSUInteger batchSize = MIN(kMaxBatchSize, remainder); - [OWSPrimaryStorage.dbReadWriteConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [self sendFakeMessages:batchSize thread:thread isTextOnly:isTextOnly transaction:transaction]; - }]; - remainder -= batchSize; - OWSLogInfo(@"sendFakeMessages %lu / %lu", (unsigned long)(counter - remainder), (unsigned long)counter); - } - }); - } -} - -+ (void)thrashInsertAndDeleteForThread:(TSThread *)thread counter:(NSUInteger)counter -{ - if (counter == 0) { - return; - } - uint32_t sendDelay = arc4random_uniform((uint32_t)(0.01 * NSEC_PER_SEC)); - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, sendDelay), dispatch_get_main_queue(), ^{ - [self sendFakeMessages:1 thread:thread]; - }); - - uint32_t deleteDelay = arc4random_uniform((uint32_t)(0.01 * NSEC_PER_SEC)); - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, deleteDelay), dispatch_get_main_queue(), ^{ - [OWSPrimaryStorage.sharedManager.dbReadWriteConnection - asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { - [self deleteRandomMessages:1 thread:thread transaction:transaction]; - }]; - [self thrashInsertAndDeleteForThread:thread counter:counter - 1]; - }); -} - -// TODO: Remove. -+ (void)sendFakeMessages:(NSUInteger)counter - thread:(TSThread *)thread - isTextOnly:(BOOL)isTextOnly - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSLogInfo(@"sendFakeMessages: %lu", (unsigned long)counter); - - for (NSUInteger i = 0; i < counter; i++) { - NSString *randomText = [[self randomText] stringByAppendingFormat:@" (sequence: %lu)", (unsigned long)i + 1]; - switch (arc4random_uniform(isTextOnly ? 2 : 4)) { - case 0: { - // MJK - should be safe to remove this senderTimestamp - TSIncomingMessage *message = - [[TSIncomingMessage alloc] initIncomingMessageWithTimestamp:[NSDate ows_millisecondTimeStamp] - inThread:thread - authorId:@"+19174054215" - sourceDeviceId:0 - messageBody:randomText - attachmentIds:@[] - expiresInSeconds:0 - quotedMessage:nil - contactShare:nil - linkPreview:nil - serverTimestamp:nil - wasReceivedByUD:NO]; - [message markAsReadNowWithSendReadReceipt:NO transaction:transaction]; - break; - } - case 1: { - [self createFakeOutgoingMessage:thread - messageBody:randomText - fakeAssetLoader:nil - messageState:TSOutgoingMessageStateFailed - isDelivered:NO - isRead:NO - quotedMessage:nil - contactShare:nil - linkPreview:nil - transaction:transaction]; - break; - } - case 2: { - UInt32 filesize = 64; - TSAttachmentPointer *pointer = - [[TSAttachmentPointer alloc] initWithServerId:237391539706350548 - key:[self createRandomNSDataOfSize:filesize] - digest:nil - byteCount:filesize - contentType:@"audio/mp3" - sourceFilename:@"test.mp3" - caption:nil - albumMessageId:nil - attachmentType:TSAttachmentTypeDefault - mediaSize:CGSizeZero]; - pointer.state = TSAttachmentPointerStateFailed; - [pointer saveWithTransaction:transaction]; - // MJK - should be safe to remove this senderTimestamp - TSIncomingMessage *message = - [[TSIncomingMessage alloc] initIncomingMessageWithTimestamp:[NSDate ows_millisecondTimeStamp] - inThread:thread - authorId:@"+19174054215" - sourceDeviceId:0 - messageBody:nil - attachmentIds:@[ - pointer.uniqueId, - ] - expiresInSeconds:0 - quotedMessage:nil - contactShare:nil - linkPreview:nil - serverTimestamp:nil - wasReceivedByUD:NO]; - [message markAsReadNowWithSendReadReceipt:NO transaction:transaction]; - break; - } - case 3: { - NSString *filename = @"test.mp3"; - UInt32 filesize = 16; - - TSAttachmentStream *attachmentStream = [[TSAttachmentStream alloc] initWithContentType:@"audio/mp3" - byteCount:filesize - sourceFilename:filename - caption:nil - albumMessageId:nil]; - - NSError *error; - BOOL success = [attachmentStream writeData:[self createRandomNSDataOfSize:filesize] error:&error]; - OWSAssertDebug(success && !error); - [attachmentStream saveWithTransaction:transaction]; - - [self createFakeOutgoingMessage:thread - messageBody:nil - attachmentId:attachmentStream.uniqueId - filename:filename - messageState:TSOutgoingMessageStateFailed - isDelivered:NO - isRead:NO - isVoiceMessage:NO - quotedMessage:nil - contactShare:nil - linkPreview:nil - transaction:transaction]; - break; - } - } - } -} - -#pragma mark - - -+ (void)createNewGroups:(NSUInteger)counter recipientId:(NSString *)recipientId -{ - if (counter < 1) { - return; - } - - NSString *groupName = [NSUUID UUID].UUIDString; - NSMutableArray *recipientIds = [@[ - recipientId, - TSAccountManager.localNumber, - ] mutableCopy]; - NSData *groupId = [Randomness generateRandomBytes:kGroupIdLength]; - TSGroupModel *groupModel = [[TSGroupModel alloc] initWithTitle:groupName memberIds:recipientIds image:nil groupId:groupId groupType:closedGroup adminIds:@[ TSAccountManager.localNumber ]]; - - __block TSGroupThread *thread; - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { - thread = [TSGroupThread getOrCreateThreadWithGroupModel:groupModel transaction:transaction]; - OWSAssertDebug(thread); - - TSOutgoingMessage *message = [TSOutgoingMessage outgoingMessageInThread:thread - groupMetaMessage:TSGroupMetaMessageNew - expiresInSeconds:0]; - [message updateWithCustomMessage:NSLocalizedString(@"GROUP_CREATED", nil) transaction:transaction]; - - [self.messageSenderJobQueue addMessage:message transaction:transaction]; - }]; - - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)1.f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [ThreadUtil enqueueMessageWithText:[@(counter) description] - inThread:thread - quotedReplyModel:nil - linkPreviewDraft:nil - transaction:transaction]; - }]; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)1.f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ - [self createNewGroups:counter - 1 recipientId:recipientId]; - }); - }); -} - -+ (void)injectFakeIncomingMessages:(NSUInteger)counter thread:(TSThread *)thread -{ - // Wait 5 seconds so debug user has time to navigate to another - // view before message processing occurs. - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.f * NSEC_PER_SEC)), - dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), - ^{ - for (NSUInteger i = 0; i < counter; i++) { - [self injectIncomingMessageInThread:thread counter:counter - i]; - } - }); -} - -+ (void)injectIncomingMessageInThread:(TSThread *)thread counter:(NSUInteger)counter -{ - OWSAssertDebug(thread); - - OWSLogInfo(@"injectIncomingMessageInThread: %lu", (unsigned long)counter); - - NSString *randomText = [self randomText]; - NSString *text = [[[@(counter) description] stringByAppendingString:@" "] stringByAppendingString:randomText]; - - SSKProtoDataMessageBuilder *dataMessageBuilder = [SSKProtoDataMessage builder]; - [dataMessageBuilder setBody:text]; - - if ([thread isKindOfClass:[TSGroupThread class]]) { - TSGroupThread *groupThread = (TSGroupThread *)thread; - SSKProtoGroupContextBuilder *groupBuilder = - [SSKProtoGroupContext builderWithId:groupThread.groupModel.groupId type:SSKProtoGroupContextTypeDeliver]; - [dataMessageBuilder setGroup:groupBuilder.buildIgnoringErrors]; - } - - SSKProtoContentBuilder *payloadBuilder = [SSKProtoContent builder]; - [payloadBuilder setDataMessage:dataMessageBuilder.buildIgnoringErrors]; - NSData *plaintextData = [payloadBuilder buildIgnoringErrors].serializedDataIgnoringErrors; - - // Try to use an arbitrary member of the current thread that isn't - // ourselves as the sender. - NSString *_Nullable recipientId = [[thread recipientIdentifiers] firstObject]; - // This might be an "empty" group with no other members. If so, use a fake - // sender id. - if (!recipientId) { - recipientId = @"+12345678901"; - } - - uint64_t timestamp = [NSDate ows_millisecondTimeStamp]; - NSString *source = recipientId; - uint32_t sourceDevice = 1; - SSKProtoEnvelopeType envelopeType = SSKProtoEnvelopeTypeCiphertext; - NSData *content = plaintextData; - - SSKProtoEnvelopeBuilder *envelopeBuilder = [SSKProtoEnvelope builderWithType:envelopeType timestamp:timestamp]; - [envelopeBuilder setSource:source]; - [envelopeBuilder setSourceDevice:sourceDevice]; - envelopeBuilder.content = content; - NSError *error; - NSData *_Nullable envelopeData = [envelopeBuilder buildSerializedDataAndReturnError:&error]; - if (error || !envelopeData) { - OWSFailDebug(@"Could not serialize envelope: %@.", error); - return; - } - - [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [SSKEnvironment.shared.batchMessageProcessor enqueueEnvelopeData:envelopeData - plaintextData:plaintextData - wasReceivedByUD:NO - transaction:transaction]; - }]; -} - -+ (void)performRandomActions:(NSUInteger)counter thread:(TSThread *)thread -{ - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.f * NSEC_PER_SEC)), - dispatch_get_main_queue(), - ^{ - [self performRandomActionInThread:thread counter:counter]; - if (counter > 0) { - [self performRandomActions:counter - 1 thread:thread]; - } - }); -} - -+ (void)performRandomActionInThread:(TSThread *)thread counter:(NSUInteger)counter -{ - typedef void (^TransactionBlock)(YapDatabaseReadWriteTransaction *transaction); - NSArray *actionBlocks = @[ - ^(YapDatabaseReadWriteTransaction *transaction) { - // injectIncomingMessageInThread doesn't take a transaction. - dispatch_async(dispatch_get_main_queue(), ^{ - [self injectIncomingMessageInThread:thread counter:counter]; - }); - }, - ^(YapDatabaseReadWriteTransaction *transaction) { - // sendTextMessageInThread doesn't take a transaction. - dispatch_async(dispatch_get_main_queue(), ^{ - [self sendTextMessageInThread:thread counter:counter]; - }); - }, - ^(YapDatabaseReadWriteTransaction *transaction) { - NSUInteger messageCount = (NSUInteger)(1 + arc4random_uniform(4)); - [self sendFakeMessages:messageCount thread:thread isTextOnly:NO transaction:transaction]; - }, - ^(YapDatabaseReadWriteTransaction *transaction) { - NSUInteger messageCount = (NSUInteger)(1 + arc4random_uniform(4)); - [self deleteRandomMessages:messageCount thread:thread transaction:transaction]; - }, - ^(YapDatabaseReadWriteTransaction *transaction) { - NSUInteger messageCount = (NSUInteger)(1 + arc4random_uniform(4)); - [self deleteLastMessages:messageCount thread:thread transaction:transaction]; - }, - ^(YapDatabaseReadWriteTransaction *transaction) { - NSUInteger messageCount = (NSUInteger)(1 + arc4random_uniform(4)); - [self deleteRandomRecentMessages:messageCount thread:thread transaction:transaction]; - }, - ^(YapDatabaseReadWriteTransaction *transaction) { - NSUInteger messageCount = (NSUInteger)(1 + arc4random_uniform(4)); - [self insertAndDeleteNewOutgoingMessages:messageCount thread:thread transaction:transaction]; - }, - ^(YapDatabaseReadWriteTransaction *transaction) { - NSUInteger messageCount = (NSUInteger)(1 + arc4random_uniform(4)); - [self resurrectNewOutgoingMessages1:messageCount thread:thread transaction:transaction]; - }, - ^(YapDatabaseReadWriteTransaction *transaction) { - NSUInteger messageCount = (NSUInteger)(1 + arc4random_uniform(4)); - [self resurrectNewOutgoingMessages2:messageCount thread:thread transaction:transaction]; - }, - ]; - [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - NSUInteger actionCount = 1 + (NSUInteger)arc4random_uniform(3); - for (NSUInteger actionIdx = 0; actionIdx < actionCount; actionIdx++) { - TransactionBlock actionBlock = actionBlocks[(NSUInteger)arc4random_uniform((uint32_t)actionBlocks.count)]; - actionBlock(transaction); - } - }]; -} - -+ (void)deleteRandomMessages:(NSUInteger)count - thread:(TSThread *)thread - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSLogInfo(@"deleteRandomMessages: %zd", count); - - YapDatabaseViewTransaction *interactionsByThread = [transaction ext:TSMessageDatabaseViewExtensionName]; - NSUInteger messageCount = [interactionsByThread numberOfItemsInGroup:thread.uniqueId]; - - NSMutableArray *messageIndices = [NSMutableArray new]; - for (NSUInteger messageIdx = 0; messageIdx < messageCount; messageIdx++) { - [messageIndices addObject:@(messageIdx)]; - } - NSMutableArray *interactions = [NSMutableArray new]; - for (NSUInteger i = 0; i < count && messageIndices.count > 0; i++) { - NSUInteger idx = (NSUInteger)arc4random_uniform((uint32_t)messageIndices.count); - NSNumber *messageIdx = messageIndices[idx]; - [messageIndices removeObjectAtIndex:idx]; - - TSInteraction *_Nullable interaction = - [interactionsByThread objectAtIndex:messageIdx.unsignedIntegerValue inGroup:thread.uniqueId]; - OWSAssertDebug(interaction); - [interactions addObject:interaction]; - } - - for (TSInteraction *interaction in interactions) { - [interaction removeWithTransaction:transaction]; - } -} - -+ (void)deleteLastMessages:(NSUInteger)count - thread:(TSThread *)thread - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSLogInfo(@"deleteLastMessages"); - - YapDatabaseViewTransaction *interactionsByThread = [transaction ext:TSMessageDatabaseViewExtensionName]; - NSUInteger messageCount = (NSUInteger)[interactionsByThread numberOfItemsInGroup:thread.uniqueId]; - - NSMutableArray *messageIndices = [NSMutableArray new]; - for (NSUInteger i = 0; i < count && i < messageCount; i++) { - NSUInteger messageIdx = messageCount - (1 + i); - [messageIndices addObject:@(messageIdx)]; - } - NSMutableArray *interactions = [NSMutableArray new]; - for (NSNumber *messageIdx in messageIndices) { - TSInteraction *_Nullable interaction = - [interactionsByThread objectAtIndex:messageIdx.unsignedIntegerValue inGroup:thread.uniqueId]; - OWSAssertDebug(interaction); - [interactions addObject:interaction]; - } - for (TSInteraction *interaction in interactions) { - [interaction removeWithTransaction:transaction]; - } -} - -+ (void)deleteRandomRecentMessages:(NSUInteger)count - thread:(TSThread *)thread - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSLogInfo(@"deleteRandomRecentMessages: %zd", count); - - YapDatabaseViewTransaction *interactionsByThread = [transaction ext:TSMessageDatabaseViewExtensionName]; - NSInteger messageCount = (NSInteger)[interactionsByThread numberOfItemsInGroup:thread.uniqueId]; - - NSMutableArray *messageIndices = [NSMutableArray new]; - const NSInteger kRecentMessageCount = 10; - for (NSInteger i = 0; i < kRecentMessageCount; i++) { - NSInteger messageIdx = messageCount - (1 + i); - if (messageIdx >= 0) { - [messageIndices addObject:@(messageIdx)]; - } - } - NSMutableArray *interactions = [NSMutableArray new]; - for (NSUInteger i = 0; i < count && messageIndices.count > 0; i++) { - NSUInteger idx = (NSUInteger)arc4random_uniform((uint32_t)messageIndices.count); - NSNumber *messageIdx = messageIndices[idx]; - [messageIndices removeObjectAtIndex:idx]; - - TSInteraction *_Nullable interaction = - [interactionsByThread objectAtIndex:messageIdx.unsignedIntegerValue inGroup:thread.uniqueId]; - OWSAssertDebug(interaction); - [interactions addObject:interaction]; - } - for (TSInteraction *interaction in interactions) { - [interaction removeWithTransaction:transaction]; - } -} - -+ (void)insertAndDeleteNewOutgoingMessages:(NSUInteger)count - thread:(TSThread *)thread - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSLogInfo(@"insertAndDeleteNewOutgoingMessages: %zd", count); - - NSMutableArray *messages = [NSMutableArray new]; - for (NSUInteger i =0; i < count; i++) { - NSString *text = [self randomText]; - OWSDisappearingMessagesConfiguration *configuration = - [OWSDisappearingMessagesConfiguration fetchObjectWithUniqueID:thread.uniqueId transaction:transaction]; - - uint32_t expiresInSeconds = (configuration.isEnabled ? configuration.durationSeconds : 0); - TSOutgoingMessage *message = [TSOutgoingMessage outgoingMessageInThread:thread - messageBody:text - attachmentId:nil - expiresInSeconds:expiresInSeconds]; - OWSLogError(@"insertAndDeleteNewOutgoingMessages timestamp: %llu.", message.timestamp); - [messages addObject:message]; - } - - for (TSOutgoingMessage *message in messages) { - [message saveWithTransaction:transaction]; - } - for (TSOutgoingMessage *message in messages) { - [message removeWithTransaction:transaction]; - } -} - -+ (void)resurrectNewOutgoingMessages1:(NSUInteger)count - thread:(TSThread *)thread - transaction:(YapDatabaseReadWriteTransaction *)initialTransaction -{ - OWSLogInfo(@"resurrectNewOutgoingMessages1.1: %zd", count); - - NSMutableArray *messages = [NSMutableArray new]; - for (NSUInteger i =0; i < count; i++) { - NSString *text = [self randomText]; - OWSDisappearingMessagesConfiguration *configuration = - [OWSDisappearingMessagesConfiguration fetchObjectWithUniqueID:thread.uniqueId - transaction:initialTransaction]; - - uint32_t expiresInSeconds = (configuration.isEnabled ? configuration.durationSeconds : 0); - TSOutgoingMessage *message = [TSOutgoingMessage outgoingMessageInThread:thread - messageBody:text - attachmentId:nil - expiresInSeconds:expiresInSeconds]; - OWSLogError(@"resurrectNewOutgoingMessages1 timestamp: %llu.", message.timestamp); - [messages addObject:message]; - } - - for (TSOutgoingMessage *message in messages) { - [message saveWithTransaction:initialTransaction]; - } - - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - OWSLogInfo(@"resurrectNewOutgoingMessages1.2: %zd", count); - [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - for (TSOutgoingMessage *message in messages) { - [message removeWithTransaction:transaction]; - } - for (TSOutgoingMessage *message in messages) { - [message saveWithTransaction:transaction]; - } - }]; - }); -} - -+ (void)resurrectNewOutgoingMessages2:(NSUInteger)count - thread:(TSThread *)thread - transaction:(YapDatabaseReadWriteTransaction *)initialTransaction -{ - OWSLogInfo(@"resurrectNewOutgoingMessages2.1: %zd", count); - - NSMutableArray *messages = [NSMutableArray new]; - for (NSUInteger i =0; i < count; i++) { - NSString *text = [self randomText]; - OWSDisappearingMessagesConfiguration *configuration = - [OWSDisappearingMessagesConfiguration fetchObjectWithUniqueID:thread.uniqueId - transaction:initialTransaction]; - // MJK TODO - remove senderTimestamp - TSOutgoingMessage *message = [[TSOutgoingMessage alloc] - initOutgoingMessageWithTimestamp:[NSDate ows_millisecondTimeStamp] - inThread:thread - messageBody:text - attachmentIds:[NSMutableArray new] - expiresInSeconds:(configuration.isEnabled ? configuration.durationSeconds - : 0)expireStartedAt:0 - isVoiceMessage:NO - groupMetaMessage:TSGroupMetaMessageUnspecified - quotedMessage:nil - contactShare:nil - linkPreview:nil]; - OWSLogError(@"resurrectNewOutgoingMessages2 timestamp: %llu.", message.timestamp); - [messages addObject:message]; - } - - for (TSOutgoingMessage *message in messages) { - [message updateWithFakeMessageState:TSOutgoingMessageStateSending transaction:initialTransaction]; - [message saveWithTransaction:initialTransaction]; - } - - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - OWSLogInfo(@"resurrectNewOutgoingMessages2.2: %zd", count); - [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - for (TSOutgoingMessage *message in messages) { - [message removeWithTransaction:transaction]; - } - }]; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - OWSLogInfo(@"resurrectNewOutgoingMessages2.3: %zd", count); - [OWSPrimaryStorage.dbReadWriteConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - for (TSOutgoingMessage *message in messages) { - [message saveWithTransaction:transaction]; - } - }]; - }); - }); -} - -+ (void)createTimestampMessagesInThread:(TSThread *)thread -{ - OWSAssertDebug(thread); - - long long now = (long long)[NSDate ows_millisecondTimeStamp]; - NSArray *timestamps = @[ - @(now + 1 * (long long)kHourInMs), - @(now), - @(now - 1 * (long long)kHourInMs), - @(now - 12 * (long long)kHourInMs), - @(now - 1 * (long long)kDayInMs), - @(now - 2 * (long long)kDayInMs), - @(now - 3 * (long long)kDayInMs), - @(now - 6 * (long long)kDayInMs), - @(now - 7 * (long long)kDayInMs), - @(now - 8 * (long long)kDayInMs), - @(now - 2 * (long long)kWeekInMs), - @(now - 1 * (long long)kMonthInMs), - @(now - 2 * (long long)kMonthInMs), - ]; - NSMutableArray *recipientIds = [thread.recipientIdentifiers mutableCopy]; - [recipientIds removeObject:TSAccountManager.localNumber]; - NSString *recipientId = (recipientIds.count > 0 ? recipientIds.firstObject : @"+19174054215"); - - [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - for (NSNumber *timestamp in timestamps) { - NSString *randomText = [self randomText]; - { - // Legit usage of SenderTimestamp to backdate incoming sent messages for Debug - TSIncomingMessage *message = - [[TSIncomingMessage alloc] initIncomingMessageWithTimestamp:timestamp.unsignedLongLongValue - inThread:thread - authorId:recipientId - sourceDeviceId:0 - messageBody:randomText - attachmentIds:[NSMutableArray new] - expiresInSeconds:0 - quotedMessage:nil - contactShare:nil - linkPreview:nil - serverTimestamp:nil - wasReceivedByUD:NO]; - [message markAsReadNowWithSendReadReceipt:NO transaction:transaction]; - } - { - // MJK TODO - this might be the one place we actually use senderTimestamp - TSOutgoingMessage *message = - [[TSOutgoingMessage alloc] initOutgoingMessageWithTimestamp:timestamp.unsignedLongLongValue - inThread:thread - messageBody:randomText - attachmentIds:[NSMutableArray new] - expiresInSeconds:0 - expireStartedAt:0 - isVoiceMessage:NO - groupMetaMessage:TSGroupMetaMessageUnspecified - quotedMessage:nil - contactShare:nil - linkPreview:nil]; - [message saveWithTransaction:transaction]; - [message updateWithFakeMessageState:TSOutgoingMessageStateSent transaction:transaction]; - [message updateWithSentRecipient:recipientId wasSentByUD:NO transaction:transaction]; - [message updateWithDeliveredRecipient:recipientId deliveryTimestamp:timestamp transaction:transaction]; - [message updateWithReadRecipientId:recipientId - readTimestamp:timestamp.unsignedLongLongValue - transaction:transaction]; - } - } - }]; -} - -+ (void)createDisappearingMessagesWhichFailedToStartInThread:(TSThread *)thread -{ - uint64_t now = [NSDate ows_millisecondTimeStamp]; - - // MJK TODO - should be safe to remove this senderTimestamp - TSIncomingMessage *message = [[TSIncomingMessage alloc] - initIncomingMessageWithTimestamp:now - inThread:thread - authorId:thread.recipientIdentifiers.firstObject - sourceDeviceId:0 - messageBody:[NSString - stringWithFormat:@"Should disappear 60s after %lu", (unsigned long)now] - attachmentIds:[NSMutableArray new] - expiresInSeconds:60 - quotedMessage:nil - contactShare:nil - linkPreview:nil - serverTimestamp:nil - wasReceivedByUD:NO]; - // private setter to avoid starting expire machinery. - message.read = YES; - [message save]; -} - -+ (void)testLinkificationInThread:(TSThread *)thread -{ - NSArray *strings = @[@"google.com", - @"foo.google.com", - @"https://foo.google.com", - @"https://foo.google.com/some/path.html", - @"http://кц.com", - @"кц.com", - @"http://asĸ.com", - @"кц.рф", - @"кц.рф/some/path", - @"https://кц.рф/some/path", - @"http://foo.кц.рф"]; - - [OWSPrimaryStorage.sharedManager.dbReadWriteConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - for (NSString *string in strings) { - // DO NOT log these strings with the debugger attached. - // OWSLogInfo(@"%@", string); - - { - [self createFakeIncomingMessage:thread - messageBody:string - fakeAssetLoader:nil - isAttachmentDownloaded:NO - quotedMessage:nil - transaction:transaction]; - } - { - NSString *recipientId = @"+1323555555"; - NSString *groupName = string; - NSMutableArray *recipientIds = [@[ - recipientId, - TSAccountManager.localNumber, - ] mutableCopy]; - NSData *groupId = [Randomness generateRandomBytes:kGroupIdLength]; - // TODO: Figure out if this is correct - TSGroupModel *groupModel = - [[TSGroupModel alloc] initWithTitle:groupName memberIds:recipientIds image:nil groupId:groupId groupType:closedGroup adminIds:@[ TSAccountManager.localNumber ]]; - - TSGroupThread *groupThread = - [TSGroupThread getOrCreateThreadWithGroupModel:groupModel transaction:transaction]; - OWSAssertDebug(groupThread); - } - } - }]; -} - -+ (void)testIndicScriptsInThread:(TSThread *)thread -{ - NSArray *strings = @[ - @"\u0C1C\u0C4D\u0C1E\u200C\u0C3E", - @"\u09B8\u09CD\u09B0\u200C\u09C1", - @"non-crashing string", - ]; - - [OWSPrimaryStorage.sharedManager.dbReadWriteConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - for (NSString *string in strings) { - // DO NOT log these strings with the debugger attached. - // OWSLogInfo(@"%@", string); - - { - [self createFakeIncomingMessage:thread - messageBody:string - fakeAssetLoader:nil - isAttachmentDownloaded:NO - quotedMessage:nil - transaction:transaction]; - } - { - NSString *recipientId = @"+19174054215"; - NSString *groupName = string; - NSMutableArray *recipientIds = [@[ - recipientId, - TSAccountManager.localNumber, - ] mutableCopy]; - NSData *groupId = [Randomness generateRandomBytes:kGroupIdLength]; - // TODO: Figure out if this is correct - TSGroupModel *groupModel = - [[TSGroupModel alloc] initWithTitle:groupName memberIds:recipientIds image:nil groupId:groupId groupType:closedGroup adminIds:@[ TSAccountManager.localNumber ]]; - - TSGroupThread *groupThread = - [TSGroupThread getOrCreateThreadWithGroupModel:groupModel transaction:transaction]; - OWSAssertDebug(groupThread); - } - } - }]; -} - -+ (void)testZalgoTextInThread:(TSThread *)thread -{ - NSArray *strings = @[ - @"Ṱ̴̤̺̣͚͚̭̰̤̮̑̓̀͂͘͡h̵̢̤͔̼̗̦̖̬͌̀͒̀͘i̴̮̤͎͎̝̖̻͓̅̆͆̓̎͘͡ͅŝ̡̡̳͔̓͗̾̀̇͒͘͢͢͡͡ ỉ̛̲̩̫̝͉̀̒͐͋̾͘͢͡͞s̶̨̫̞̜̹͛́̇͑̅̒̊̈ s̵͍̲̗̠̗͈̦̬̉̿͂̏̐͆̾͐͊̾ǫ̶͍̼̝̉͊̉͢͜͞͝ͅͅṁ̵̡̨̬̤̝͔̣̄̍̋͊̿̄͋̈ͅe̪̪̻̱͖͚͈̲̍̃͘͠͝ z̷̢̢̛̩̦̱̺̼͑́̉̾ą͕͎̠̮̹̱̓̔̓̈̈́̅̐͢l̵̨͚̜͉̟̜͉͎̃͆͆͒͑̍̈̚͜͞ğ͔̖̫̞͎͍̒̂́̒̿̽̆͟o̶̢̬͚̘̤̪͇̻̒̋̇̊̏͢͡͡͠ͅ t̡̛̥̦̪̮̅̓̑̈́̉̓̽͛͢͡ȩ̡̩͓͈̩͎͗̔͑̌̓͊͆͝x̫̦͓̤͓̘̝̪͊̆͌͊̽̃̏͒͘͘͢ẗ̶̢̨̛̰̯͕͔́̐͗͌͟͠.̷̩̼̼̩̞̘̪́͗̅͊̎̾̅̏̀̕͟ͅ", - @"This is some normal text", - ]; - - [OWSPrimaryStorage.sharedManager.dbReadWriteConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - for (NSString *string in strings) { - OWSLogInfo(@"sending zalgo"); - - { - [self createFakeIncomingMessage:thread - messageBody:string - fakeAssetLoader:nil - isAttachmentDownloaded:NO - quotedMessage:nil - transaction:transaction]; - } - { - NSString *recipientId = @"+19174054215"; - NSString *groupName = string; - NSMutableArray *recipientIds = [@[ - recipientId, - TSAccountManager.localNumber, - ] mutableCopy]; - NSData *groupId = [Randomness generateRandomBytes:kGroupIdLength]; - // TODO: Figure out if this is correct - TSGroupModel *groupModel = - [[TSGroupModel alloc] initWithTitle:groupName memberIds:recipientIds image:nil groupId:groupId groupType:closedGroup adminIds:@[ TSAccountManager.localNumber ]]; - - TSGroupThread *groupThread = - [TSGroupThread getOrCreateThreadWithGroupModel:groupModel transaction:transaction]; - OWSAssertDebug(groupThread); - } - } - }]; -} - -+ (void)testDirectionalFilenamesInThread:(TSThread *)thread -{ - NSMutableArray *filenames = [@[ - @"a_test\u202Dabc.exe", - @"b_test\u202Eabc.exe", - @"c_testabc.exe", - ] mutableCopy]; - __block void (^sendUnsafeFile)(void); - sendUnsafeFile = ^{ - if (filenames.count < 1) { - return; - } - NSString *filename = filenames.lastObject; - [filenames removeLastObject]; - NSString *utiType = (NSString *)kUTTypeData; - const NSUInteger kDataLength = 32; - DataSource *_Nullable dataSource = - [DataSourceValue dataSourceWithData:[self createRandomNSDataOfSize:kDataLength] utiType:utiType]; - [dataSource setSourceFilename:filename]; - SignalAttachment *attachment = - [SignalAttachment attachmentWithDataSource:dataSource dataUTI:utiType imageQuality:TSImageQualityOriginal]; - - OWSAssertDebug(attachment); - if ([attachment hasError]) { - OWSLogError(@"attachment[%@]: %@", [attachment sourceFilename], [attachment errorName]); - [DDLog flushLog]; - } - OWSAssertDebug(![attachment hasError]); - [self sendAttachment:attachment thread:thread messageBody:nil]; - - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ - sendUnsafeFile(); - sendUnsafeFile = nil; - }); - }; -} - -+ (void)deleteAllMessagesInThread:(TSThread *)thread -{ - [OWSPrimaryStorage.sharedManager.newDatabaseConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [thread removeAllThreadInteractionsWithTransaction:transaction]; - }]; -} - -#pragma mark - Utility - -+ (NSString *)actionLabelForHasCaption:(BOOL)hasCaption - outgoingMessageState:(TSOutgoingMessageState)outgoingMessageState - isDelivered:(BOOL)isDelivered - isRead:(BOOL)isRead -{ - NSMutableString *label = [NSMutableString new]; - if (hasCaption) { - [label appendString:@" 🔤"]; - } - if (outgoingMessageState == TSOutgoingMessageStateFailed) { - [label appendString:@" (Unsent)"]; - } else if (outgoingMessageState == TSOutgoingMessageStateSending) { - [label appendString:@" (Sending)"]; - } else if (outgoingMessageState == TSOutgoingMessageStateSent) { - if (isRead) { - [label appendString:@" (Read)"]; - } else if (isDelivered) { - [label appendString:@" (Delivered)"]; - } else { - [label appendString:@" (Sent)"]; - } - } else { - OWSFailDebug(@"unknown message state."); - } - return label; -} - -+ (TSOutgoingMessage *)createFakeOutgoingMessage:(TSThread *)thread - messageBody:(nullable NSString *)messageBody - fakeAssetLoader:(nullable DebugUIMessagesAssetLoader *)fakeAssetLoader - messageState:(TSOutgoingMessageState)messageState - isDelivered:(BOOL)isDelivered - isRead:(BOOL)isRead - quotedMessage:(nullable TSQuotedMessage *)quotedMessage - contactShare:(nullable OWSContact *)contactShare - linkPreview:(nullable OWSLinkPreview *)linkPreview - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(thread); - - // Seamlessly convert oversize text messages to oversize text attachments. - if ([messageBody lengthOfBytesUsingEncoding:NSUTF8StringEncoding] >= kOversizeTextMessageSizeThreshold) { - OWSAssertDebug(!fakeAssetLoader); - fakeAssetLoader = [DebugUIMessagesAssetLoader oversizeTextInstanceWithText:messageBody]; - messageBody = nil; - } - - TSAttachment *_Nullable attachment = nil; - if (fakeAssetLoader) { - attachment = [self createFakeAttachment:fakeAssetLoader isAttachmentDownloaded:YES transaction:transaction]; - } - - return [self createFakeOutgoingMessage:thread - messageBody:messageBody - attachmentId:attachment.uniqueId - filename:fakeAssetLoader.filename - messageState:messageState - isDelivered:isDelivered - isRead:isRead - isVoiceMessage:attachment.isVoiceMessage - quotedMessage:quotedMessage - contactShare:contactShare - linkPreview:linkPreview - transaction:transaction]; -} - -+ (TSOutgoingMessage *)createFakeOutgoingMessage:(TSThread *)thread - messageBody:(nullable NSString *)messageBody - attachmentId:(nullable NSString *)attachmentId - filename:(nullable NSString *)filename - messageState:(TSOutgoingMessageState)messageState - isDelivered:(BOOL)isDelivered - isRead:(BOOL)isRead - isVoiceMessage:(BOOL)isVoiceMessage - quotedMessage:(nullable TSQuotedMessage *)quotedMessage - contactShare:(nullable OWSContact *)contactShare - linkPreview:(nullable OWSLinkPreview *)linkPreview - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(thread); - OWSAssertDebug(transaction); - OWSAssertDebug(messageBody.length > 0 || attachmentId.length > 0 || contactShare); - - NSMutableArray *attachmentIds = [NSMutableArray new]; - if (attachmentId) { - [attachmentIds addObject:attachmentId]; - } - - // MJK TODO - remove senderTimestamp - TSOutgoingMessage *message = - [[TSOutgoingMessage alloc] initOutgoingMessageWithTimestamp:[NSDate ows_millisecondTimeStamp] - inThread:thread - messageBody:messageBody - attachmentIds:attachmentIds - expiresInSeconds:0 - expireStartedAt:0 - isVoiceMessage:isVoiceMessage - groupMetaMessage:TSGroupMetaMessageUnspecified - quotedMessage:quotedMessage - contactShare:contactShare - linkPreview:linkPreview]; - - if (attachmentId.length > 0 && filename.length > 0) { - message.attachmentFilenameMap[attachmentId] = filename; - } - - [message saveWithTransaction:transaction]; - [message updateWithFakeMessageState:messageState transaction:transaction]; - if (isDelivered) { - NSString *_Nullable recipientId = thread.recipientIdentifiers.lastObject; - OWSAssertDebug(recipientId.length > 0); - [message updateWithDeliveredRecipient:recipientId - deliveryTimestamp:@([NSDate ows_millisecondTimeStamp]) - transaction:transaction]; - } - if (isRead) { - NSString *_Nullable recipientId = thread.recipientIdentifiers.lastObject; - OWSAssertDebug(recipientId.length > 0); - [message updateWithReadRecipientId:recipientId - readTimestamp:[NSDate ows_millisecondTimeStamp] - transaction:transaction]; - } - return message; -} - -+ (TSIncomingMessage *)createFakeIncomingMessage:(TSThread *)thread - messageBody:(nullable NSString *)messageBody - fakeAssetLoader:(nullable DebugUIMessagesAssetLoader *)fakeAssetLoader - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - quotedMessage:(nullable TSQuotedMessage *)quotedMessage - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(thread); - - // Seamlessly convert oversize text messages to oversize text attachments. - if ([messageBody lengthOfBytesUsingEncoding:NSUTF8StringEncoding] >= kOversizeTextMessageSizeThreshold) { - OWSAssertDebug(!fakeAssetLoader); - fakeAssetLoader = [DebugUIMessagesAssetLoader oversizeTextInstanceWithText:messageBody]; - messageBody = nil; - } - - TSAttachment *_Nullable attachment = nil; - if (fakeAssetLoader) { - attachment = [self createFakeAttachment:fakeAssetLoader - isAttachmentDownloaded:isAttachmentDownloaded - transaction:transaction]; - } - - return [self createFakeIncomingMessage:thread - messageBody:messageBody - attachmentId:attachment.uniqueId - filename:fakeAssetLoader.filename - isAttachmentDownloaded:isAttachmentDownloaded - quotedMessage:quotedMessage - transaction:transaction]; -} - -+ (TSIncomingMessage *)createFakeIncomingMessage:(TSThread *)thread - messageBody:(nullable NSString *)messageBody - attachmentId:(nullable NSString *)attachmentId - filename:(nullable NSString *)filename - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - quotedMessage:(nullable TSQuotedMessage *)quotedMessage - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(thread); - OWSAssertDebug(transaction); - OWSAssertDebug(messageBody.length > 0 || attachmentId.length > 0); - - NSMutableArray *attachmentIds = [NSMutableArray new]; - if (attachmentId) { - [attachmentIds addObject:attachmentId]; - } - - // // Random time within last n years. Helpful for filling out a media gallery over time. - // double yearsMillis = 4.0 * kYearsInMs; - // uint64_t millisAgo = (uint64_t)(((double)arc4random() / ((double)0xffffffff)) * yearsMillis); - // uint64_t timestamp = [NSDate ows_millisecondTimeStamp] - millisAgo; - - // MJK TODO - should be safe to remove this senderTimestamp - TSIncomingMessage *message = - [[TSIncomingMessage alloc] initIncomingMessageWithTimestamp:[NSDate ows_millisecondTimeStamp] - inThread:thread - authorId:@"+19174054215" - sourceDeviceId:0 - messageBody:messageBody - attachmentIds:attachmentIds - expiresInSeconds:0 - quotedMessage:quotedMessage - contactShare:nil - linkPreview:nil - serverTimestamp:nil - wasReceivedByUD:NO]; - [message markAsReadNowWithSendReadReceipt:NO transaction:transaction]; - return message; -} - -+ (TSAttachment *)createFakeAttachment:(DebugUIMessagesAssetLoader *)fakeAssetLoader - isAttachmentDownloaded:(BOOL)isAttachmentDownloaded - transaction:(YapDatabaseReadWriteTransaction *)transaction -{ - OWSAssertDebug(fakeAssetLoader); - OWSAssertDebug(fakeAssetLoader.filePath); - OWSAssertDebug(transaction); - - if (isAttachmentDownloaded) { - DataSource *dataSource = - [DataSourcePath dataSourceWithFilePath:fakeAssetLoader.filePath shouldDeleteOnDeallocation:NO]; - NSString *filename = dataSource.sourceFilename; - // To support "fake missing" attachments, we sometimes lie about the - // length of the data. - UInt32 nominalDataLength = (UInt32)MAX((NSUInteger)1, dataSource.dataLength); - TSAttachmentStream *attachmentStream = [[TSAttachmentStream alloc] initWithContentType:fakeAssetLoader.mimeType - byteCount:nominalDataLength - sourceFilename:filename - caption:nil - albumMessageId:nil]; - NSError *error; - BOOL success = [attachmentStream writeData:dataSource.data error:&error]; - OWSAssertDebug(success && !error); - [attachmentStream saveWithTransaction:transaction]; - return attachmentStream; - } else { - UInt32 filesize = 64; - TSAttachmentPointer *attachmentPointer = - [[TSAttachmentPointer alloc] initWithServerId:237391539706350548 - key:[self createRandomNSDataOfSize:filesize] - digest:nil - byteCount:filesize - contentType:fakeAssetLoader.mimeType - sourceFilename:fakeAssetLoader.filename - caption:nil - albumMessageId:nil - attachmentType:TSAttachmentTypeDefault - mediaSize:CGSizeZero]; - attachmentPointer.state = TSAttachmentPointerStateFailed; - [attachmentPointer saveWithTransaction:transaction]; - return attachmentPointer; - } -} - -+ (void)sendMediaAlbumInThread:(TSThread *)thread -{ - OWSLogInfo(@""); - - const uint32_t kMinImageCount = 2; - const uint32_t kMaxImageCount = 10; - uint32_t imageCount = kMinImageCount + arc4random_uniform(kMaxImageCount - kMinImageCount); - NSString *_Nullable messageBody = (arc4random_uniform(2) > 0 ? @"This is the media gallery title..." : nil); - [self sendMediaAlbumInThread:thread imageCount:imageCount messageBody:messageBody]; -} - -+ (void)sendExemplaryMediaGalleriesInThread:(TSThread *)thread -{ - OWSLogInfo(@""); - - [self sendMediaAlbumInThread:thread imageCount:2 messageBody:nil]; - [self sendMediaAlbumInThread:thread imageCount:3 messageBody:nil]; - [self sendMediaAlbumInThread:thread imageCount:4 messageBody:nil]; - [self sendMediaAlbumInThread:thread imageCount:5 messageBody:nil]; - [self sendMediaAlbumInThread:thread imageCount:6 messageBody:nil]; - [self sendMediaAlbumInThread:thread imageCount:7 messageBody:nil]; - NSString *messageBody = @"This is the media gallery title..."; - [self sendMediaAlbumInThread:thread imageCount:2 messageBody:messageBody]; - [self sendMediaAlbumInThread:thread imageCount:3 messageBody:messageBody]; - [self sendMediaAlbumInThread:thread imageCount:4 messageBody:messageBody]; - [self sendMediaAlbumInThread:thread imageCount:5 messageBody:messageBody]; - [self sendMediaAlbumInThread:thread imageCount:6 messageBody:messageBody]; - [self sendMediaAlbumInThread:thread imageCount:7 messageBody:messageBody]; -} - -+ (void)sendMediaAlbumInThread:(TSThread *)thread - imageCount:(uint32_t)imageCount - messageBody:(nullable NSString *)messageBody - fakeAssetLoaders:(NSArray *)fakeAssetLoaders -{ - OWSAssertDebug(imageCount > 0); - OWSLogInfo(@""); - - NSMutableArray *attachments = [NSMutableArray new]; - for (uint32_t i = 0; i < imageCount; i++) { - DebugUIMessagesAssetLoader *fakeAssetLoader - = fakeAssetLoaders[arc4random_uniform((uint32_t)fakeAssetLoaders.count)]; - OWSAssertDebug([NSFileManager.defaultManager fileExistsAtPath:fakeAssetLoader.filePath]); - DataSource *dataSource = - [DataSourcePath dataSourceWithFilePath:fakeAssetLoader.filePath shouldDeleteOnDeallocation:NO]; - SignalAttachment *attachment = - [SignalAttachment attachmentWithDataSource:dataSource - dataUTI:[MIMETypeUtil utiTypeForMIMEType:fakeAssetLoader.mimeType] - imageQuality:TSImageQualityOriginal]; - if (arc4random_uniform(2) == 0) { - attachment.captionText = [self randomText]; - } - [attachments addObject:attachment]; - } - - [self.dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { - TSOutgoingMessage *message = [ThreadUtil enqueueMessageWithText:messageBody - mediaAttachments:attachments - inThread:thread - quotedReplyModel:nil - linkPreviewDraft:nil - transaction:transaction]; - OWSLogDebug(@"timestamp: %llu.", message.timestamp); - }]; -} - -+ (void)sendMediaAlbumInThread:(TSThread *)thread - imageCount:(uint32_t)imageCount - messageBody:(nullable NSString *)messageBody -{ - OWSAssertDebug(thread); - - NSArray *fakeAssetLoaders = @[ - [DebugUIMessagesAssetLoader jpegInstance], - [DebugUIMessagesAssetLoader largePngInstance], - [DebugUIMessagesAssetLoader tinyPngInstance], - [DebugUIMessagesAssetLoader gifInstance], - [DebugUIMessagesAssetLoader mp4Instance], - ]; - [DebugUIMessagesAssetLoader prepareAssetLoaders:fakeAssetLoaders - success:^{ - [self sendMediaAlbumInThread:thread - imageCount:imageCount - messageBody:messageBody - fakeAssetLoaders:fakeAssetLoaders]; - } - failure:^{ - OWSLogError(@"Could not prepare fake asset loaders."); - }]; -} - -#endif - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIMessagesAction.h b/Session/src/ViewControllers/DebugUI/DebugUIMessagesAction.h deleted file mode 100644 index 44f69c54f..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIMessagesAction.h +++ /dev/null @@ -1,62 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIMessagesUtils.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DebugUIMessagesAction : NSObject - -@property (nonatomic) NSString *label; - -- (void)prepareAndPerformNTimes:(NSUInteger)count; - -@end - -#pragma mark - - -@interface DebugUIMessagesSingleAction : DebugUIMessagesAction - -+ (DebugUIMessagesAction *)actionWithLabel:(NSString *)label - staggeredActionBlock:(StaggeredActionBlock)staggeredActionBlock; - -+ (DebugUIMessagesAction *)actionWithLabel:(NSString *)label - unstaggeredActionBlock:(UnstaggeredActionBlock)unstaggeredActionBlock; - -+ (DebugUIMessagesAction *)actionWithLabel:(NSString *)label - staggeredActionBlock:(StaggeredActionBlock)staggeredActionBlock - prepareBlock:(ActionPrepareBlock)prepareBlock; - -+ (DebugUIMessagesAction *)actionWithLabel:(NSString *)label - unstaggeredActionBlock:(UnstaggeredActionBlock)unstaggeredActionBlock - prepareBlock:(ActionPrepareBlock)prepareBlock; - -@end - -#pragma mark - - -typedef NS_ENUM(NSUInteger, SubactionMode) { - SubactionMode_Random = 0, - SubactionMode_Ordered, -}; - -@interface DebugUIMessagesGroupAction : DebugUIMessagesAction - -@property (nonatomic, readonly) SubactionMode subactionMode; -@property (nonatomic, readonly, nullable) NSArray *subactions; - -// Given a group of subactions, perform a single random subaction each time. -+ (DebugUIMessagesAction *)randomGroupActionWithLabel:(NSString *)label - subactions:(NSArray *)subactions; - -// Given a group of subactions, perform the subactions in order. -// -// If prepareAndPerformNTimes: is called with count == subactions.count, all of the subactions -// are performed exactly once. -+ (DebugUIMessagesAction *)allGroupActionWithLabel:(NSString *)label - subactions:(NSArray *)subactions; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIMessagesAction.m b/Session/src/ViewControllers/DebugUI/DebugUIMessagesAction.m deleted file mode 100644 index 6aaaadc59..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIMessagesAction.m +++ /dev/null @@ -1,288 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIMessagesAction.h" -#import - -NS_ASSUME_NONNULL_BEGIN - -@class DebugUIMessagesSingleAction; - -@interface DebugUIMessagesAction () - -@end - -#pragma mark - - -@interface DebugUIMessagesSingleAction () - -@property (nonatomic, nullable) ActionPrepareBlock prepareBlock; - -// "Single" actions should have exactly one "staggered" or "unstaggered" action block. -@property (nonatomic, nullable) StaggeredActionBlock staggeredActionBlock; -@property (nonatomic, nullable) UnstaggeredActionBlock unstaggeredActionBlock; - -@end - -#pragma mark - - -@implementation DebugUIMessagesAction - -- (DebugUIMessagesSingleAction *)nextActionToPerform -{ - return (DebugUIMessagesSingleAction *)self; -} - -- (void)prepare:(ActionSuccessBlock)success failure:(ActionFailureBlock)failure -{ - OWSAssertDebug(success); - OWSAssertDebug(failure); - - OWSAbstractMethod(); - - success(); -} - -- (void)prepareAndPerformNTimes:(NSUInteger)count -{ - OWSLogInfo(@"%@ prepareAndPerformNTimes: %zd", self.label, count); - [DDLog flushLog]; - - [self prepare:^{ - [self performNTimes:count - success:^{ - } - failure:^{ - }]; - } - failure:^{ - }]; -} - -- (void)performNTimes:(NSUInteger)countParam success:(ActionSuccessBlock)success failure:(ActionFailureBlock)failure -{ - OWSAssertDebug(success); - OWSAssertDebug(failure); - - OWSLogInfo(@"%@ performNTimes: %zd", self.label, countParam); - [DDLog flushLog]; - - if (countParam < 1) { - success(); - return; - } - - __block NSUInteger count = countParam; - [OWSPrimaryStorage.sharedManager.newDatabaseConnection readWriteWithBlock:^( - YapDatabaseReadWriteTransaction *transaction) { - NSUInteger batchSize = 0; - while (count > 0) { - NSUInteger index = count; - - DebugUIMessagesSingleAction *action = [self nextActionToPerform]; - OWSAssertDebug([action isKindOfClass:[DebugUIMessagesSingleAction class]]); - - if (action.staggeredActionBlock) { - OWSAssertDebug(!action.unstaggeredActionBlock); - action.staggeredActionBlock(index, - transaction, - ^{ - dispatch_after( - dispatch_time(DISPATCH_TIME_NOW, (int64_t)1.f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ - OWSLogInfo(@"%@ performNTimes success: %zd", self.label, count); - [self performNTimes:count - 1 success:success failure:failure]; - }); - }, - failure); - - break; - } else { - OWSAssertDebug(action.unstaggeredActionBlock); - - // TODO: We could check result for failure. - action.unstaggeredActionBlock(index, transaction); - - const NSUInteger kMaxBatchSize = 2500; - batchSize++; - if (batchSize >= kMaxBatchSize) { - dispatch_after( - dispatch_time(DISPATCH_TIME_NOW, (int64_t)1.f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ - OWSLogInfo(@"%@ performNTimes success: %zd", self.label, count); - [self performNTimes:count - 1 success:success failure:failure]; - }); - - break; - } - count--; - } - } - }]; -} - -@end - -#pragma mark - - -@implementation DebugUIMessagesSingleAction - -+ (DebugUIMessagesAction *)actionWithLabel:(NSString *)label - staggeredActionBlock:(StaggeredActionBlock)staggeredActionBlock -{ - OWSAssertDebug(label.length > 0); - OWSAssertDebug(staggeredActionBlock); - - DebugUIMessagesSingleAction *instance = [DebugUIMessagesSingleAction new]; - instance.label = label; - instance.staggeredActionBlock = staggeredActionBlock; - return instance; -} - -+ (DebugUIMessagesAction *)actionWithLabel:(NSString *)label - unstaggeredActionBlock:(UnstaggeredActionBlock)unstaggeredActionBlock -{ - OWSAssertDebug(label.length > 0); - OWSAssertDebug(unstaggeredActionBlock); - - DebugUIMessagesSingleAction *instance = [DebugUIMessagesSingleAction new]; - instance.label = label; - instance.unstaggeredActionBlock = unstaggeredActionBlock; - return instance; -} - -+ (DebugUIMessagesAction *)actionWithLabel:(NSString *)label - staggeredActionBlock:(StaggeredActionBlock)staggeredActionBlock - prepareBlock:(ActionPrepareBlock)prepareBlock -{ - OWSAssertDebug(label.length > 0); - OWSAssertDebug(staggeredActionBlock); - OWSAssertDebug(prepareBlock); - - DebugUIMessagesSingleAction *instance = [DebugUIMessagesSingleAction new]; - instance.label = label; - instance.staggeredActionBlock = staggeredActionBlock; - instance.prepareBlock = prepareBlock; - return instance; -} - -+ (DebugUIMessagesAction *)actionWithLabel:(NSString *)label - unstaggeredActionBlock:(UnstaggeredActionBlock)unstaggeredActionBlock - prepareBlock:(ActionPrepareBlock)prepareBlock -{ - OWSAssertDebug(label.length > 0); - OWSAssertDebug(unstaggeredActionBlock); - OWSAssertDebug(prepareBlock); - - DebugUIMessagesSingleAction *instance = [DebugUIMessagesSingleAction new]; - instance.label = label; - instance.unstaggeredActionBlock = unstaggeredActionBlock; - instance.prepareBlock = prepareBlock; - return instance; -} - -- (void)prepare:(ActionSuccessBlock)success failure:(ActionFailureBlock)failure -{ - OWSAssertDebug(success); - OWSAssertDebug(failure); - - if (self.prepareBlock) { - self.prepareBlock(success, failure); - } else { - success(); - } -} - -@end - -#pragma mark - - -@interface DebugUIMessagesGroupAction () - -@property (nonatomic) SubactionMode subactionMode; -@property (nonatomic, nullable) NSArray *subactions; -@property (nonatomic) NSUInteger subactionIndex; - -@end - -#pragma mark - - -@implementation DebugUIMessagesGroupAction - -- (DebugUIMessagesSingleAction *)nextActionToPerform -{ - OWSAssertDebug(self.subactions.count > 0); - - switch (self.subactionMode) { - case SubactionMode_Random: { - DebugUIMessagesAction *subaction = self.subactions[arc4random_uniform((uint32_t)self.subactions.count)]; - OWSAssertDebug(subaction); - return subaction.nextActionToPerform; - } - case SubactionMode_Ordered: { - DebugUIMessagesAction *subaction = self.subactions[self.subactionIndex]; - OWSAssertDebug(subaction); - self.subactionIndex = (self.subactionIndex + 1) % self.subactions.count; - return subaction.nextActionToPerform; - } - } -} - -- (void)prepare:(ActionSuccessBlock)success failure:(ActionFailureBlock)failure -{ - OWSAssertDebug(success); - OWSAssertDebug(failure); - - [DebugUIMessagesGroupAction prepareSubactions:[self.subactions mutableCopy] success:success failure:failure]; -} - -+ (void)prepareSubactions:(NSMutableArray *)unpreparedSubactions - success:(ActionSuccessBlock)success - failure:(ActionFailureBlock)failure -{ - OWSAssertDebug(success); - OWSAssertDebug(failure); - - if (unpreparedSubactions.count < 1) { - return success(); - } - - DebugUIMessagesAction *nextAction = unpreparedSubactions.lastObject; - [unpreparedSubactions removeLastObject]; - OWSLogInfo(@"preparing: %@", nextAction.label); - [DDLog flushLog]; - [nextAction prepare:^{ - [self prepareSubactions:unpreparedSubactions success:success failure:failure]; - } - failure:^{ - }]; -} - -+ (DebugUIMessagesAction *)randomGroupActionWithLabel:(NSString *)label - subactions:(NSArray *)subactions -{ - OWSAssertDebug(label.length > 0); - OWSAssertDebug(subactions.count > 0); - - DebugUIMessagesGroupAction *instance = [DebugUIMessagesGroupAction new]; - instance.label = label; - instance.subactions = subactions; - instance.subactionMode = SubactionMode_Random; - return instance; -} - -+ (DebugUIMessagesAction *)allGroupActionWithLabel:(NSString *)label - subactions:(NSArray *)subactions -{ - OWSAssertDebug(label.length > 0); - OWSAssertDebug(subactions.count > 0); - - DebugUIMessagesGroupAction *instance = [DebugUIMessagesGroupAction new]; - instance.label = label; - instance.subactions = subactions; - instance.subactionMode = SubactionMode_Ordered; - return instance; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIMessagesAssetLoader.h b/Session/src/ViewControllers/DebugUI/DebugUIMessagesAssetLoader.h deleted file mode 100644 index ff3ba42f4..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIMessagesAssetLoader.h +++ /dev/null @@ -1,52 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIMessagesUtils.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DebugUIMessagesAssetLoader : NSObject - -@property (nonatomic) NSString *filename; -@property (nonatomic) NSString *mimeType; - -@property (nonatomic) ActionPrepareBlock prepareBlock; - -@property (nonatomic, nullable) NSString *filePath; - -- (NSString *)labelEmoji; - -#pragma mark - - -+ (instancetype)jpegInstance; -+ (instancetype)gifInstance; -+ (instancetype)largeGifInstance; -+ (instancetype)mp3Instance; -+ (instancetype)mp4Instance; -+ (instancetype)compactPortraitPngInstance; -+ (instancetype)compactLandscapePngInstance; -+ (instancetype)tallPortraitPngInstance; -+ (instancetype)wideLandscapePngInstance; -+ (instancetype)largePngInstance; -+ (instancetype)tinyPngInstance; -+ (instancetype)pngInstanceWithSize:(CGSize)size - backgroundColor:(UIColor *)backgroundColor - textColor:(UIColor *)textColor - label:(NSString *)label; -+ (instancetype)tinyPdfInstance; -+ (instancetype)largePdfInstance; -+ (instancetype)missingPngInstance; -+ (instancetype)missingPdfInstance; -+ (instancetype)oversizeTextInstance; -+ (instancetype)oversizeTextInstanceWithText:(NSString *)text; - -#pragma mark - - -+ (void)prepareAssetLoaders:(NSArray *)assetLoaders - success:(dispatch_block_t)success - failure:(dispatch_block_t)failure; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIMessagesAssetLoader.m b/Session/src/ViewControllers/DebugUI/DebugUIMessagesAssetLoader.m deleted file mode 100644 index ac01a2aa9..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIMessagesAssetLoader.m +++ /dev/null @@ -1,628 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIMessagesAssetLoader.h" -#import -#import -#import -#import -#import -#import -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@implementation DebugUIMessagesAssetLoader - -- (NSString *)labelEmoji -{ - return [TSAttachment emojiForMimeType:self.mimeType]; -} - -+ (DebugUIMessagesAssetLoader *)fakeAssetLoaderWithUrl:(NSString *)fileUrl mimeType:(NSString *)mimeType -{ - OWSAssertDebug(fileUrl.length > 0); - OWSAssertDebug(mimeType.length > 0); - - DebugUIMessagesAssetLoader *instance = [DebugUIMessagesAssetLoader new]; - instance.mimeType = mimeType; - instance.filename = [NSURL URLWithString:fileUrl].lastPathComponent; - __weak DebugUIMessagesAssetLoader *weakSelf = instance; - instance.prepareBlock = ^(ActionSuccessBlock success, ActionFailureBlock failure) { - [weakSelf ensureURLAssetLoaded:fileUrl success:success failure:failure]; - }; - return instance; -} - -- (void)ensureURLAssetLoaded:(NSString *)fileUrl success:(ActionSuccessBlock)success failure:(ActionFailureBlock)failure -{ - OWSAssertDebug(success); - OWSAssertDebug(failure); - OWSAssertDebug(self.filename.length > 0); - OWSAssertDebug(self.mimeType.length > 0); - - if (self.filePath) { - success(); - return; - } - - // Use a predictable file path so that we reuse the cache between app launches. - NSString *temporaryDirectory = OWSTemporaryDirectory(); - NSString *cacheDirectory = [temporaryDirectory stringByAppendingPathComponent:@"cached_random_files"]; - [OWSFileSystem ensureDirectoryExists:cacheDirectory]; - NSString *filePath = [cacheDirectory stringByAppendingPathComponent:self.filename]; - if ([NSFileManager.defaultManager fileExistsAtPath:filePath]) { - self.filePath = filePath; - return success(); - } - - NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; - AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:configuration]; - sessionManager.responseSerializer = [AFHTTPResponseSerializer serializer]; - OWSAssertDebug(sessionManager.responseSerializer); - [sessionManager GET:fileUrl - parameters:nil - progress:nil - success:^(NSURLSessionDataTask *task, NSData *_Nullable responseObject) { - if ([responseObject writeToFile:filePath atomically:YES]) { - self.filePath = filePath; - OWSAssertDebug([NSFileManager.defaultManager fileExistsAtPath:filePath]); - success(); - } else { - OWSFailDebug(@"Error write url response [%@]: %@", fileUrl, filePath); - failure(); - } - } - failure:^(NSURLSessionDataTask *_Nullable task, NSError *requestError) { - OWSFailDebug(@"Error downloading url[%@]: %@", fileUrl, requestError); - failure(); - }]; -} - -#pragma mark - - -+ (DebugUIMessagesAssetLoader *)fakePngAssetLoaderWithImageSize:(CGSize)imageSize - backgroundColor:(UIColor *)backgroundColor - textColor:(UIColor *)textColor - label:(NSString *)label -{ - OWSAssertDebug(imageSize.width > 0); - OWSAssertDebug(imageSize.height > 0); - OWSAssertDebug(backgroundColor); - OWSAssertDebug(textColor); - OWSAssertDebug(label.length > 0); - - DebugUIMessagesAssetLoader *instance = [DebugUIMessagesAssetLoader new]; - instance.mimeType = OWSMimeTypeImagePng; - instance.filename = @"image.png"; - __weak DebugUIMessagesAssetLoader *weakSelf = instance; - instance.prepareBlock = ^(ActionSuccessBlock success, ActionFailureBlock failure) { - [weakSelf ensurePngAssetLoaded:imageSize - backgroundColor:backgroundColor - textColor:textColor - label:label - success:success - failure:failure]; - }; - return instance; -} - -- (void)ensurePngAssetLoaded:(CGSize)imageSize - backgroundColor:(UIColor *)backgroundColor - textColor:(UIColor *)textColor - label:(NSString *)label - success:(ActionSuccessBlock)success - failure:(ActionFailureBlock)failure -{ - OWSAssertDebug(success); - OWSAssertDebug(failure); - OWSAssertDebug(self.filename.length > 0); - OWSAssertDebug(self.mimeType.length > 0); - OWSAssertDebug(imageSize.width > 0 && imageSize.height > 0); - OWSAssertDebug(backgroundColor); - OWSAssertDebug(textColor); - OWSAssertDebug(label.length > 0); - - if (self.filePath) { - success(); - return; - } - - @autoreleasepool { - NSString *filePath = [OWSFileSystem temporaryFilePathWithFileExtension:@"png"]; - UIImage *image = - [self createRandomPngWithSize:imageSize backgroundColor:backgroundColor textColor:textColor label:label]; - NSData *pngData = UIImagePNGRepresentation(image); - [pngData writeToFile:filePath atomically:YES]; - self.filePath = filePath; - OWSAssertDebug([NSFileManager.defaultManager fileExistsAtPath:filePath]); - success(); - } -} - -- (nullable UIImage *)createRandomPngWithSize:(CGSize)imageSize - backgroundColor:(UIColor *)backgroundColor - textColor:(UIColor *)textColor - label:(NSString *)label -{ - OWSAssertDebug(imageSize.width > 0 && imageSize.height > 0); - OWSAssertDebug(backgroundColor); - OWSAssertDebug(textColor); - OWSAssertDebug(label.length > 0); - - @autoreleasepool { - imageSize.width /= UIScreen.mainScreen.scale; - imageSize.height /= UIScreen.mainScreen.scale; - - CGRect frame = CGRectZero; - frame.size = imageSize; - CGFloat smallDimension = MIN(imageSize.width, imageSize.height); - UIFont *font = [UIFont boldSystemFontOfSize:smallDimension * 0.5f]; - NSDictionary *textAttributes = @{ NSFontAttributeName : font, NSForegroundColorAttributeName : textColor }; - - CGRect textFrame = - [label boundingRectWithSize:frame.size - options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading) - attributes:textAttributes - context:nil]; - - UIGraphicsBeginImageContextWithOptions(frame.size, NO, [UIScreen mainScreen].scale); - CGContextRef context = UIGraphicsGetCurrentContext(); - - CGContextSetFillColorWithColor(context, backgroundColor.CGColor); - CGContextFillRect(context, frame); - [label drawAtPoint:CGPointMake(CGRectGetMidX(frame) - CGRectGetMidX(textFrame), - CGRectGetMidY(frame) - CGRectGetMidY(textFrame)) - withAttributes:textAttributes]; - - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - return image; - } -} - -#pragma mark - - -+ (DebugUIMessagesAssetLoader *)fakeRandomAssetLoaderWithLength:(NSUInteger)dataLength mimeType:(NSString *)mimeType -{ - OWSAssertDebug(dataLength > 0); - OWSAssertDebug(mimeType.length > 0); - - DebugUIMessagesAssetLoader *instance = [DebugUIMessagesAssetLoader new]; - instance.mimeType = mimeType; - NSString *fileExtension = [MIMETypeUtil fileExtensionForMIMEType:mimeType]; - OWSAssertDebug(fileExtension.length > 0); - instance.filename = [@"attachment" stringByAppendingPathExtension:fileExtension]; - __weak DebugUIMessagesAssetLoader *weakSelf = instance; - instance.prepareBlock = ^(ActionSuccessBlock success, ActionFailureBlock failure) { - [weakSelf ensureRandomAssetLoaded:dataLength success:success failure:failure]; - }; - return instance; -} - -- (void)ensureRandomAssetLoaded:(NSUInteger)dataLength - success:(ActionSuccessBlock)success - failure:(ActionFailureBlock)failure -{ - OWSAssertDebug(dataLength > 0); - OWSAssertDebug(dataLength < INT_MAX); - OWSAssertDebug(success); - OWSAssertDebug(failure); - OWSAssertDebug(self.filename.length > 0); - OWSAssertDebug(self.mimeType.length > 0); - - if (self.filePath) { - success(); - return; - } - - @autoreleasepool { - NSString *fileExtension = [MIMETypeUtil fileExtensionForMIMEType:self.mimeType]; - OWSAssertDebug(fileExtension.length > 0); - NSData *data = [Randomness generateRandomBytes:(int)dataLength]; - OWSAssertDebug(data); - NSString *filePath = [OWSFileSystem temporaryFilePathWithFileExtension:fileExtension]; - BOOL didWrite = [data writeToFile:filePath atomically:YES]; - OWSAssertDebug(didWrite); - self.filePath = filePath; - OWSAssertDebug([NSFileManager.defaultManager fileExistsAtPath:filePath]); - } - - success(); -} - -#pragma mark - - -+ (DebugUIMessagesAssetLoader *)fakeMissingAssetLoaderWithMimeType:(NSString *)mimeType -{ - OWSAssertDebug(mimeType.length > 0); - - DebugUIMessagesAssetLoader *instance = [DebugUIMessagesAssetLoader new]; - instance.mimeType = mimeType; - NSString *fileExtension = [MIMETypeUtil fileExtensionForMIMEType:mimeType]; - OWSAssertDebug(fileExtension.length > 0); - instance.filename = [@"attachment" stringByAppendingPathExtension:fileExtension]; - __weak DebugUIMessagesAssetLoader *weakSelf = instance; - instance.prepareBlock = ^(ActionSuccessBlock success, ActionFailureBlock failure) { - [weakSelf ensureMissingAssetLoaded:success failure:failure]; - }; - return instance; -} - -- (void)ensureMissingAssetLoaded:(ActionSuccessBlock)success failure:(ActionFailureBlock)failure -{ - OWSAssertDebug(success); - OWSAssertDebug(failure); - OWSAssertDebug(self.filename.length > 0); - OWSAssertDebug(self.mimeType.length > 0); - - if (self.filePath) { - success(); - return; - } - - NSString *fileExtension = [MIMETypeUtil fileExtensionForMIMEType:self.mimeType]; - OWSAssertDebug(fileExtension.length > 0); - NSString *filePath = [OWSFileSystem temporaryFilePathWithFileExtension:fileExtension]; - BOOL didCreate = [NSFileManager.defaultManager createFileAtPath:filePath contents:nil attributes:nil]; - OWSAssertDebug(didCreate); - self.filePath = filePath; - OWSAssertDebug([NSFileManager.defaultManager fileExistsAtPath:filePath]); - - success(); -} - -#pragma mark - - -+ (DebugUIMessagesAssetLoader *)fakeOversizeTextAssetLoader -{ - DebugUIMessagesAssetLoader *instance = [DebugUIMessagesAssetLoader new]; - instance.mimeType = OWSMimeTypeOversizeTextMessage; - instance.filename = @"attachment.txt"; - __weak DebugUIMessagesAssetLoader *weakSelf = instance; - instance.prepareBlock = ^(ActionSuccessBlock success, ActionFailureBlock failure) { - [weakSelf ensureOversizeTextAssetLoaded:success failure:failure]; - }; - return instance; -} - -- (void)ensureOversizeTextAssetLoaded:(ActionSuccessBlock)success failure:(ActionFailureBlock)failure -{ - OWSAssertDebug(success); - OWSAssertDebug(failure); - OWSAssertDebug(self.filename.length > 0); - OWSAssertDebug(self.mimeType.length > 0); - - if (self.filePath) { - success(); - return; - } - - NSMutableString *message = [NSMutableString new]; - for (NSUInteger i = 0; i < 32; i++) { - [message appendString:@"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse rutrum, nulla " - @"vitae pretium hendrerit, tellus turpis pharetra libero, vitae sodales tortor ante vel " - @"sem. Fusce sed nisl a lorem gravida tincidunt. Suspendisse efficitur non quam ac " - @"sodales. Aenean ut velit maximus, posuere sem a, accumsan nunc. Donec ullamcorper " - @"turpis lorem. Quisque dignissim purus eu placerat ultricies. Proin at urna eget mi " - @"semper congue. Aenean non elementum ex. Praesent pharetra quam at sem vestibulum, " - @"vestibulum ornare dolor elementum. Vestibulum massa tortor, scelerisque sit amet " - @"pulvinar a, rhoncus vitae nisl. Sed mi nunc, tempus at varius in, malesuada vitae " - @"dui. Vivamus efficitur pulvinar erat vitae congue. Proin vehicula turpis non felis " - @"congue facilisis. Nullam aliquet dapibus ligula ac mollis. Etiam sit amet posuere " - @"lorem, in rhoncus nisi.\n\n"]; - } - - NSString *fileExtension = @"txt"; - NSString *filePath = [OWSFileSystem temporaryFilePathWithFileExtension:fileExtension]; - NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding]; - OWSAssertDebug(data); - BOOL didWrite = [data writeToFile:filePath atomically:YES]; - OWSAssertDebug(didWrite); - self.filePath = filePath; - OWSAssertDebug([NSFileManager.defaultManager fileExistsAtPath:filePath]); - - success(); -} - -#pragma mark - - -+ (DebugUIMessagesAssetLoader *)fakeOversizeTextAssetLoaderWithText:(NSString *)text -{ - DebugUIMessagesAssetLoader *instance = [DebugUIMessagesAssetLoader new]; - instance.mimeType = OWSMimeTypeOversizeTextMessage; - instance.filename = @"attachment.txt"; - __weak DebugUIMessagesAssetLoader *weakSelf = instance; - instance.prepareBlock = ^(ActionSuccessBlock success, ActionFailureBlock failure) { - [weakSelf ensureOversizeTextAssetLoadedWithText:text success:success failure:failure]; - }; - return instance; -} - -- (void)ensureOversizeTextAssetLoadedWithText:(NSString *)text - success:(ActionSuccessBlock)success - failure:(ActionFailureBlock)failure -{ - OWSAssertDebug(success); - OWSAssertDebug(failure); - OWSAssertDebug(self.filename.length > 0); - OWSAssertDebug(self.mimeType.length > 0); - - if (self.filePath) { - success(); - return; - } - - NSString *fileExtension = @"txt"; - NSString *filePath = [OWSFileSystem temporaryFilePathWithFileExtension:fileExtension]; - NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding]; - OWSAssertDebug(data); - BOOL didWrite = [data writeToFile:filePath atomically:YES]; - OWSAssertDebug(didWrite); - self.filePath = filePath; - OWSAssertDebug([NSFileManager.defaultManager fileExistsAtPath:filePath]); - - success(); -} - -#pragma mark - - -+ (instancetype)jpegInstance -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [DebugUIMessagesAssetLoader - fakeAssetLoaderWithUrl:@"https://s3.amazonaws.com/ows-data/example_attachment_media/random-jpg.JPG" - mimeType:OWSMimeTypeImageJpeg]; - }); - return instance; -} - -+ (instancetype)gifInstance -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [DebugUIMessagesAssetLoader - fakeAssetLoaderWithUrl:@"https://s3.amazonaws.com/ows-data/example_attachment_media/random-gif.gif" - mimeType:OWSMimeTypeImageGif]; - }); - return instance; -} - -+ (instancetype)largeGifInstance -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = - [DebugUIMessagesAssetLoader fakeAssetLoaderWithUrl:@"https://i.giphy.com/media/LTw0F3GAdaao8/source.gif" - mimeType:OWSMimeTypeImageGif]; - }); - return instance; -} - -+ (instancetype)mp3Instance -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [DebugUIMessagesAssetLoader - fakeAssetLoaderWithUrl:@"https://s3.amazonaws.com/ows-data/example_attachment_media/random-mp3.mp3" - mimeType:@"audio/mp3"]; - }); - return instance; -} - -+ (instancetype)mp4Instance -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [DebugUIMessagesAssetLoader - fakeAssetLoaderWithUrl:@"https://s3.amazonaws.com/ows-data/example_attachment_media/random-mp4.mp4" - mimeType:@"video/mp4"]; - }); - return instance; -} - -+ (instancetype)compactPortraitPngInstance -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [DebugUIMessagesAssetLoader fakePngAssetLoaderWithImageSize:CGSizeMake(60, 100) - backgroundColor:[UIColor blueColor] - textColor:[UIColor whiteColor] - label:@"P"]; - }); - return instance; -} - -+ (instancetype)compactLandscapePngInstance -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [DebugUIMessagesAssetLoader fakePngAssetLoaderWithImageSize:CGSizeMake(100, 60) - backgroundColor:[UIColor greenColor] - textColor:[UIColor whiteColor] - label:@"L"]; - }); - return instance; -} - -+ (instancetype)tallPortraitPngInstance -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [DebugUIMessagesAssetLoader fakePngAssetLoaderWithImageSize:CGSizeMake(10, 100) - backgroundColor:[UIColor yellowColor] - textColor:[UIColor whiteColor] - label:@"P"]; - }); - return instance; -} - -+ (instancetype)wideLandscapePngInstance -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [DebugUIMessagesAssetLoader fakePngAssetLoaderWithImageSize:CGSizeMake(100, 10) - backgroundColor:[UIColor purpleColor] - textColor:[UIColor whiteColor] - label:@"L"]; - }); - return instance; -} - -+ (instancetype)largePngInstance -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [DebugUIMessagesAssetLoader fakePngAssetLoaderWithImageSize:CGSizeMake(4000, 4000) - backgroundColor:[UIColor brownColor] - textColor:[UIColor whiteColor] - label:@"B"]; - }); - return instance; -} - -+ (instancetype)tinyPngInstance -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [DebugUIMessagesAssetLoader fakePngAssetLoaderWithImageSize:CGSizeMake(2, 2) - backgroundColor:[UIColor cyanColor] - textColor:[UIColor whiteColor] - label:@"T"]; - }); - return instance; -} - -+ (instancetype)pngInstanceWithSize:(CGSize)size - backgroundColor:(UIColor *)backgroundColor - textColor:(UIColor *)textColor - label:(NSString *)label -{ - return [DebugUIMessagesAssetLoader fakePngAssetLoaderWithImageSize:size - backgroundColor:backgroundColor - textColor:textColor - label:label]; -} - -+ (instancetype)tinyPdfInstance -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [DebugUIMessagesAssetLoader fakeRandomAssetLoaderWithLength:256 mimeType:@"application/pdf"]; - }); - return instance; -} - -+ (instancetype)largePdfInstance -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = - [DebugUIMessagesAssetLoader fakeRandomAssetLoaderWithLength:4 * 1024 * 1024 mimeType:@"application/pdf"]; - }); - return instance; -} - -+ (instancetype)missingPngInstance -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [DebugUIMessagesAssetLoader fakeMissingAssetLoaderWithMimeType:OWSMimeTypeImagePng]; - }); - return instance; -} - -+ (instancetype)missingPdfInstance -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [DebugUIMessagesAssetLoader fakeMissingAssetLoaderWithMimeType:@"application/pdf"]; - }); - return instance; -} - -+ (instancetype)oversizeTextInstance -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [DebugUIMessagesAssetLoader fakeOversizeTextAssetLoader]; - }); - return instance; -} - -+ (instancetype)oversizeTextInstanceWithText:(NSString *)text -{ - static DebugUIMessagesAssetLoader *instance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [DebugUIMessagesAssetLoader fakeOversizeTextAssetLoaderWithText:text]; - }); - return instance; -} - -#pragma mark - - -+ (void)prepareAssetLoaders:(NSArray *)assetLoaders - success:(dispatch_block_t)success - failure:(dispatch_block_t)failure -{ - - NSMutableArray *promises = [NSMutableArray array]; - NSMutableArray *errors = [NSMutableArray array]; - - for (DebugUIMessagesAssetLoader *assetLoader in assetLoaders) { - // Use chained promises to make the code more readable. - AnyPromise *promise = [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { - assetLoader.prepareBlock( - ^{ - // The value doesn't matter, we just need any non-NSError value. - resolve(@(1)); - }, - ^{ - NSError *error = - [NSError errorWithDomain:@"DebugUI" - code:0 - userInfo:@{ NSLocalizedDescriptionKey : @"Could not prepare fake assets." }]; - @synchronized(errors) { - [errors addObject:error]; - } - resolve(error); - }); - }]; - [promises addObject:promise]; - } - - // We could use PMKJoin() or PMKWhen(). - [PMKJoin(promises) - .then(^(id value) { - success(); - }) - .catch(^(id error) { - OWSLogError(@"Could not prepare fake asset loaders: %@.", error); - failure(); - }) retainUntilComplete]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIMessagesUtils.h b/Session/src/ViewControllers/DebugUI/DebugUIMessagesUtils.h deleted file mode 100644 index 261b8587b..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIMessagesUtils.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -NS_ASSUME_NONNULL_BEGIN - -@class YapDatabaseReadWriteTransaction; - -typedef void (^ActionSuccessBlock)(void); -typedef void (^ActionFailureBlock)(void); -typedef void (^ActionPrepareBlock)(ActionSuccessBlock success, ActionFailureBlock failure); -typedef void (^StaggeredActionBlock)(NSUInteger index, - YapDatabaseReadWriteTransaction *transaction, - ActionSuccessBlock success, - ActionFailureBlock failure); -typedef void (^UnstaggeredActionBlock)(NSUInteger index, YapDatabaseReadWriteTransaction *transaction); - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIMisc.h b/Session/src/ViewControllers/DebugUI/DebugUIMisc.h deleted file mode 100644 index c890d2657..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIMisc.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIPage.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DebugUIMisc : DebugUIPage - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIMisc.m b/Session/src/ViewControllers/DebugUI/DebugUIMisc.m deleted file mode 100644 index ab86ea35e..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIMisc.m +++ /dev/null @@ -1,337 +0,0 @@ -// -// Copyright (c) 2019 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIMisc.h" -#import "DebugUIMessagesAssetLoader.h" -#import "OWSBackup.h" -#import "OWSCountryMetadata.h" -#import "OWSTableViewController.h" -#import "Session-Swift.h" -#import "ThreadUtil.h" -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface OWSStorage (DebugUI) - -- (NSData *)databasePassword; - -@end - -#pragma mark - - -@implementation DebugUIMisc - -#pragma mark - Dependencies - -+ (YapDatabaseConnection *)dbConnection -{ - return [OWSPrimaryStorage.sharedManager dbReadWriteConnection]; -} - -#pragma mark - Factory Methods - -- (NSString *)name -{ - return @"Misc."; -} - -- (nullable OWSTableSection *)sectionForThread:(nullable TSThread *)thread -{ - NSMutableArray *items = [NSMutableArray new]; - [items addObject:[OWSTableItem itemWithTitle:@"Enable Manual Censorship Circumvention" - actionBlock:^{ - [DebugUIMisc setManualCensorshipCircumventionEnabled:YES]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Disable Manual Censorship Circumvention" - actionBlock:^{ - [DebugUIMisc setManualCensorshipCircumventionEnabled:NO]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Clear experience upgrades (works once per launch)" - actionBlock:^{ - [ExperienceUpgrade removeAllObjectsInCollection]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Clear hasDismissedOffers" - actionBlock:^{ - [DebugUIMisc clearHasDismissedOffers]; - }]]; - - [items addObject:[OWSTableItem itemWithTitle:@"Delete disappearing messages config" - actionBlock:^{ - [[OWSPrimaryStorage sharedManager].newDatabaseConnection readWriteWithBlock:^( - YapDatabaseReadWriteTransaction *_Nonnull transaction) { - OWSDisappearingMessagesConfiguration *config = - [OWSDisappearingMessagesConfiguration - fetchOrBuildDefaultWithThreadId:thread.uniqueId - transaction:transaction]; - [config removeWithTransaction:transaction]; - }]; - }]]; - - [items addObject:[OWSTableItem - itemWithTitle:@"Re-register" - actionBlock:^{ - [OWSAlerts - showConfirmationAlertWithTitle:@"Re-register?" - message:@"If you proceed, you will not lose any of your " - @"current messages, but your account will be " - @"deactivated until you complete re-registration." - proceedTitle:@"Proceed" - proceedAction:^(UIAlertAction *_Nonnull action) { - [DebugUIMisc reregister]; - }]; - }]]; - - - if (thread) { - [items addObject:[OWSTableItem itemWithTitle:@"Send Encrypted Database" - actionBlock:^{ - [DebugUIMisc sendEncryptedDatabase:thread]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Send Unencrypted Database" - actionBlock:^{ - [DebugUIMisc sendUnencryptedDatabase:thread]; - }]]; - } - - [items addObject:[OWSTableItem itemWithTitle:@"Reset 2FA Repetition Interval" - actionBlock:^() { - [OWS2FAManager.sharedManager setDefaultRepetitionInterval]; - }]]; - -#ifdef DEBUG - [items addObject:[OWSTableItem subPageItemWithText:@"Share UIImage" - actionBlock:^(UIViewController *viewController) { - UIImage *image = - [UIImage imageWithColor:UIColor.redColor size:CGSizeMake(1.f, 1.f)]; - [AttachmentSharing showShareUIForUIImage:image]; - }]]; - [items addObject:[OWSTableItem subPageItemWithText:@"Share 2 Images" - actionBlock:^(UIViewController *viewController) { - [DebugUIMisc shareImages:2]; - }]]; - [items addObject:[OWSTableItem subPageItemWithText:@"Share 2 Videos" - actionBlock:^(UIViewController *viewController) { - [DebugUIMisc shareVideos:2]; - }]]; - [items addObject:[OWSTableItem subPageItemWithText:@"Share 2 PDFs" - actionBlock:^(UIViewController *viewController) { - [DebugUIMisc sharePDFs:2]; - }]]; -#endif - - [items - addObject:[OWSTableItem - itemWithTitle:@"Increment Database Extension Versions" - actionBlock:^() { - for (NSString *extensionName in OWSPrimaryStorage.sharedManager.registeredExtensionNames) { - [OWSStorage incrementVersionOfDatabaseExtension:extensionName]; - } - }]]; - - [items addObject:[OWSTableItem itemWithTitle:@"Fetch system contacts" - actionBlock:^() { - [Environment.shared.contactsManager requestSystemContactsOnce]; - }]]; - - [items addObject:[OWSTableItem itemWithTitle:@"Cycle websockets" - actionBlock:^() { - [SSKEnvironment.shared.socketManager cycleSocket]; - }]]; - - return [OWSTableSection sectionWithTitle:self.name items:items]; -} - -+ (void)reregister -{ - -} - -+ (void)setManualCensorshipCircumventionEnabled:(BOOL)isEnabled -{ - OWSCountryMetadata *countryMetadata = nil; - NSString *countryCode = OWSSignalService.sharedInstance.manualCensorshipCircumventionCountryCode; - if (countryCode) { - countryMetadata = [OWSCountryMetadata countryMetadataForCountryCode:countryCode]; - } - - if (!countryMetadata) { - countryCode = [PhoneNumber defaultCountryCode]; - if (countryCode) { - countryMetadata = [OWSCountryMetadata countryMetadataForCountryCode:countryCode]; - } - } - - if (!countryMetadata) { - countryCode = @"US"; - countryMetadata = [OWSCountryMetadata countryMetadataForCountryCode:countryCode]; - } - - OWSAssertDebug(countryMetadata); - OWSSignalService.sharedInstance.manualCensorshipCircumventionCountryCode = countryCode; - OWSSignalService.sharedInstance.isCensorshipCircumventionManuallyActivated = isEnabled; -} - -+ (void)clearHasDismissedOffers -{ - [OWSPrimaryStorage.dbReadWriteConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { - NSMutableArray *contactThreads = [NSMutableArray new]; - [transaction - enumerateKeysAndObjectsInCollection:[TSThread collection] - usingBlock:^(NSString *_Nonnull key, id _Nonnull object, BOOL *_Nonnull stop) { - TSThread *thread = object; - if (thread.isGroupThread) { - return; - } - TSContactThread *contactThread = object; - [contactThreads addObject:contactThread]; - }]; - for (TSContactThread *contactThread in contactThreads) { - if (contactThread.hasDismissedOffers) { - contactThread.hasDismissedOffers = NO; - [contactThread saveWithTransaction:transaction]; - } - } - }]; -} - -+ (void)sendEncryptedDatabase:(TSThread *)thread -{ - NSString *filePath = [OWSFileSystem temporaryFilePathWithFileExtension:@"sqlite"]; - NSString *fileName = filePath.lastPathComponent; - - __block BOOL success; - [OWSPrimaryStorage.sharedManager.newDatabaseConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - NSError *error; - success = [[NSFileManager defaultManager] copyItemAtPath:OWSPrimaryStorage.databaseFilePath - toPath:filePath - error:&error]; - if (!success || error) { - OWSFailDebug(@"Could not copy database file: %@.", error); - success = NO; - } - }]; - - if (!success) { - return; - } - - NSString *utiType = [MIMETypeUtil utiTypeForFileExtension:fileName.pathExtension]; - DataSource *_Nullable dataSource = [DataSourcePath dataSourceWithFilePath:filePath shouldDeleteOnDeallocation:YES]; - [dataSource setSourceFilename:fileName]; - SignalAttachment *attachment = [SignalAttachment attachmentWithDataSource:dataSource dataUTI:utiType]; - NSData *databasePassword = [OWSPrimaryStorage.sharedManager databasePassword]; - attachment.captionText = [databasePassword hexadecimalString]; - [self sendAttachment:attachment thread:thread]; -} - -+ (void)sendAttachment:(SignalAttachment *)attachment thread:(TSThread *)thread -{ - if (!attachment || [attachment hasError]) { - OWSFailDebug(@"attachment[%@]: %@", [attachment sourceFilename], [attachment errorName]); - return; - } - [self.dbConnection readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { - [ThreadUtil enqueueMessageWithText:nil - mediaAttachments:@[ attachment ] - inThread:thread - quotedReplyModel:nil - linkPreviewDraft:nil - transaction:transaction]; - }]; -} - -+ (void)sendUnencryptedDatabase:(TSThread *)thread -{ - NSString *filePath = [OWSFileSystem temporaryFilePathWithFileExtension:@"sqlite"]; - NSString *fileName = filePath.lastPathComponent; - - NSError *error = [OWSPrimaryStorage.sharedManager.newDatabaseConnection backupToPath:filePath]; - if (error) { - OWSFailDebug(@"Could not copy database file: %@.", error); - return; - } - - NSString *utiType = [MIMETypeUtil utiTypeForFileExtension:fileName.pathExtension]; - DataSource *_Nullable dataSource = [DataSourcePath dataSourceWithFilePath:filePath shouldDeleteOnDeallocation:YES]; - [dataSource setSourceFilename:fileName]; - SignalAttachment *attachment = [SignalAttachment attachmentWithDataSource:dataSource dataUTI:utiType]; - [self sendAttachment:attachment thread:thread]; -} - -#ifdef DEBUG - -+ (void)shareAssets:(NSUInteger)count - fromAssetLoaders:(NSArray *)assetLoaders -{ - [DebugUIMessagesAssetLoader prepareAssetLoaders:assetLoaders - success:^{ - [self shareAssets:count - fromPreparedAssetLoaders:assetLoaders]; - } - failure:^{ - OWSLogError(@"Could not prepare asset loaders."); - }]; -} - -+ (void)shareAssets:(NSUInteger)count - fromPreparedAssetLoaders:(NSArray *)assetLoaders -{ - __block NSMutableArray *urls = [NSMutableArray new]; - for (NSUInteger i = 0;i < count;i++) { - DebugUIMessagesAssetLoader *assetLoader = assetLoaders[arc4random_uniform((uint32_t) assetLoaders.count)]; - NSString *filePath = [OWSFileSystem temporaryFilePathWithFileExtension:assetLoader.filePath.pathExtension]; - NSError *error; - [[NSFileManager defaultManager] copyItemAtPath:assetLoader.filePath toPath:filePath error:&error]; - OWSAssertDebug(!error); - [urls addObject:[NSURL fileURLWithPath:filePath]]; - } - OWSLogVerbose(@"urls: %@", urls); - [AttachmentSharing showShareUIForURLs:urls completion:^{ - urls = nil; - }]; -} - -+ (void)shareImages:(NSUInteger)count -{ - [self shareAssets:count - fromAssetLoaders:@[ - [DebugUIMessagesAssetLoader jpegInstance], - [DebugUIMessagesAssetLoader tinyPngInstance], - ]]; -} - -+ (void)shareVideos:(NSUInteger)count -{ - [self shareAssets:count - fromAssetLoaders:@[ - [DebugUIMessagesAssetLoader mp4Instance], - ]]; -} - -+ (void)sharePDFs:(NSUInteger)count -{ - [self shareAssets:count - fromAssetLoaders:@[ - [DebugUIMessagesAssetLoader tinyPdfInstance], - ]]; -} - -#endif - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUINotifications.swift b/Session/src/ViewControllers/DebugUI/DebugUINotifications.swift deleted file mode 100644 index d6a9f180d..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUINotifications.swift +++ /dev/null @@ -1,174 +0,0 @@ -// -// Copyright (c) 2019 Open Whisper Systems. All rights reserved. -// - -import Foundation -import SignalUtilitiesKit -import SignalUtilitiesKit -import PromiseKit - -class DebugUINotifications: DebugUIPage { - - // MARK: Dependencies - - var notificationPresenter: NotificationPresenter { - return AppEnvironment.shared.notificationPresenter - } - var messageSender: MessageSender { - return SSKEnvironment.shared.messageSender - } - var contactsManager: OWSContactsManager { - return Environment.shared.contactsManager - } - - // MARK: Overrides - - override func name() -> String { - return "Notifications" - } - - override func section(thread: TSThread?) -> OWSTableSection? { - guard let thread = thread else { - owsFailDebug("Notifications must specify thread.") - return nil - } - - var sectionItems: [OWSTableItem] = [] - -// if let contactThread = thread as? TSContactThread { -// sectionItems += [ -// OWSTableItem(title: "All Notifications in Sequence") { [weak self] in -// self?.notifyForEverythingInSequence(contactThread: contactThread).retainUntilComplete() -// }, -// OWSTableItem(title: "Incoming Call") { [weak self] in -// self?.notifyForIncomingCall(thread: contactThread).retainUntilComplete() -// }, -// OWSTableItem(title: "Call Missed") { [weak self] in -// self?.notifyForMissedCall(thread: contactThread).retainUntilComplete() -// }, -// OWSTableItem(title: "Call Rejected: New Safety Number") { [weak self] in -// self?.notifyForMissedCallBecauseOfNewIdentity(thread: contactThread).retainUntilComplete() -// }, -// OWSTableItem(title: "Call Rejected: No Longer Verified") { [weak self] in -// self?.notifyForMissedCallBecauseOfNoLongerVerifiedIdentity(thread: contactThread).retainUntilComplete() -// } -// ] -// } - -// sectionItems += [ -// OWSTableItem(title: "Last Incoming Message") { [weak self] in -// self?.notifyForIncomingMessage(thread: thread).retainUntilComplete() -// }, -// -// OWSTableItem(title: "Notify For Error Message") { [weak self] in -// self?.notifyForErrorMessage(thread: thread).retainUntilComplete() -// }, -// -// OWSTableItem(title: "Notify For Threadless Error Message") { [weak self] in -// self?.notifyUserForThreadlessErrorMessage().retainUntilComplete() -// } -// ] - - return OWSTableSection(title: "Notifications have delay: \(kNotificationDelay)s", items: sectionItems) - } - - // MARK: Helpers - - func readWrite(_ block: @escaping (YapDatabaseReadWriteTransaction) -> Void) { - OWSPrimaryStorage.shared().dbReadWriteConnection.readWrite(block) - } - - // After enqueing the notification you may want to background the app or lock the screen before it triggers, so - // we give a little delay. - let kNotificationDelay: TimeInterval = 5 - - func delayedNotificationDispatch(block: @escaping () -> Void) -> Guarantee { - Logger.info("delaying for \(kNotificationDelay) seconds") - - // Notifications won't sound if the app is suspended. - let taskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: nil) - - return after(seconds: kNotificationDelay).done { - block() - }.then { - after(seconds: 2.0) - }.done { - // We don't want to endBackgroundTask until *after* the notifications manager is done, - // but it dispatches async without a completion handler, so we just wait a while extra. - // This is fragile, but it's only for debug UI. - UIApplication.shared.endBackgroundTask(taskIdentifier) - } - } - -// func delayedNotificationDispatchWithFakeCall(thread: TSContactThread, callBlock: @escaping (SignalCall) -> Void) -> Guarantee { -// let call = SignalCall.incomingCall(localId: UUID(), remotePhoneNumber: thread.contactIdentifier(), signalingId: 0) -// -// return delayedNotificationDispatch { -// callBlock(call) -// } -// } - - // MARK: Notification Methods - -// func notifyForEverythingInSequence(contactThread: TSContactThread) -> Guarantee { -// let taskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: nil) -// return firstly { -// self.notifyForIncomingCall(thread: contactThread) -// }.then { -// self.notifyForMissedCall(thread: contactThread) -// }.then { -// self.notifyForMissedCallBecauseOfNewIdentity(thread: contactThread) -// }.then { -// self.notifyForMissedCallBecauseOfNoLongerVerifiedIdentity(thread: contactThread) -// }.then -// return firstly { -// self.notifyForIncomingMessage(thread: contactThread) -// }.then { -// self.notifyForErrorMessage(thread: contactThread) -// }.then { -// self.notifyUserForThreadlessErrorMessage() -// }.done { -// UIApplication.shared.endBackgroundTask(taskIdentifier) -// } -// } - -// func notifyForIncomingCall(thread: TSContactThread) -> Guarantee { -// Logger.info("⚠️ will present notification after delay") -// return delayedNotificationDispatchWithFakeCall(thread: thread) { call in -// self.notificationPresenter.presentIncomingCall(call, callerName: thread.name()) -// } -// } -// -// func notifyForMissedCall(thread: TSContactThread) -> Guarantee { -// Logger.info("⚠️ will present notification after delay") -// return delayedNotificationDispatchWithFakeCall(thread: thread) { call in -// self.notificationPresenter.presentMissedCall(call, callerName: thread.name()) -// } -// } -// -// func notifyForMissedCallBecauseOfNewIdentity(thread: TSContactThread) -> Guarantee { -// Logger.info("⚠️ will present notification after delay") -// return delayedNotificationDispatchWithFakeCall(thread: thread) { call in -// self.notificationPresenter.presentMissedCallBecauseOfNewIdentity(call: call, callerName: thread.name()) -// } -// } -// -// func notifyForMissedCallBecauseOfNoLongerVerifiedIdentity(thread: TSContactThread) -> Guarantee { -// Logger.info("⚠️ will present notification after delay") -// return delayedNotificationDispatchWithFakeCall(thread: thread) { call in -// self.notificationPresenter.presentMissedCallBecauseOfNoLongerVerifiedIdentity(call: call, callerName: thread.name()) -// } -// } - - func notifyUserForThreadlessErrorMessage() -> Guarantee { - Logger.info("⚠️ will present notification after delay") - return delayedNotificationDispatch { - self.readWrite { transaction in - let errorMessage = TSErrorMessage.corruptedMessageInUnknownThread() - - self.notificationPresenter.notifyUser(forThreadlessErrorMessage: errorMessage, - transaction: transaction) - } - } - } -} diff --git a/Session/src/ViewControllers/DebugUI/DebugUIPage.h b/Session/src/ViewControllers/DebugUI/DebugUIPage.h deleted file mode 100644 index d56c8fd75..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIPage.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIPage.h" - -// This preprocessor symbol controls whether or not the Debug UI is active. -// -// To show the DebugUI in production builds, comment out the #ifdef and #endif -#ifdef DEBUG -#define USE_DEBUG_UI -#endif - -NS_ASSUME_NONNULL_BEGIN - -@class OWSTableSection; -@class TSThread; - -@interface DebugUIPage : NSObject - -- (NSString *)name; - -- (nullable OWSTableSection *)sectionForThread:(nullable TSThread *)thread NS_SWIFT_NAME(section(thread:)); - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIPage.m b/Session/src/ViewControllers/DebugUI/DebugUIPage.m deleted file mode 100644 index a18f531c7..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIPage.m +++ /dev/null @@ -1,30 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIPage.h" -#import "OWSTableViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -@implementation DebugUIPage - -#pragma mark - Factory Methods - -- (NSString *)name -{ - OWSFailDebug(@"This method should be overriden in subclasses."); - - return nil; -} - -- (nullable OWSTableSection *)sectionForThread:(nullable TSThread *)thread -{ - OWSFailDebug(@"This method should be overriden in subclasses."); - - return nil; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIProfile.swift b/Session/src/ViewControllers/DebugUI/DebugUIProfile.swift deleted file mode 100644 index 15b84a540..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIProfile.swift +++ /dev/null @@ -1,62 +0,0 @@ -// -// Copyright (c) 2019 Open Whisper Systems. All rights reserved. -// - -import Foundation -import SignalUtilitiesKit -import SignalUtilitiesKit - -class DebugUIProfile: DebugUIPage { - - // MARK: - Dependencies - - var messageSender: MessageSender { - return SSKEnvironment.shared.messageSender - } - var profileManager: OWSProfileManager { - return OWSProfileManager.shared() - } - - // MARK: - Overrides - - override func name() -> String { - return "Profile" - } - - override func section(thread aThread: TSThread?) -> OWSTableSection? { - let profileManager = self.profileManager - let sectionItems = [ - OWSTableItem(title: "Clear Profile Whitelist") { - profileManager.clearProfileWhitelist() - }, - OWSTableItem(title: "Log Profile Whitelist") { - profileManager.logProfileWhitelist() - }, - OWSTableItem(title: "Log User Profiles") { - profileManager.logUserProfiles() - }, - OWSTableItem(title: "Log Profile Key") { - let localProfileKey = profileManager.localProfileKey() - Logger.info("localProfileKey: \(localProfileKey.keyData.hexadecimalString)") - profileManager.logUserProfiles() - }, - OWSTableItem(title: "Regenerate Profile/ProfileKey") { - profileManager.regenerateLocalProfile() - }, - OWSTableItem(title: "Send Profile Key Message") { [weak self] in - guard let strongSelf = self else { return } - - // MJK TODO - should be safe to remove this senderTimestamp - let message = OWSProfileKeyMessage(timestamp: NSDate.ows_millisecondTimeStamp(), in: aThread) - strongSelf.messageSender.sendPromise(message: message).done { - Logger.info("Successfully sent profile key message to thread: \(String(describing: aThread))") - }.catch { _ in - owsFailDebug("Failed to send profile key message to thread: \(String(describing: aThread))") - }.retainUntilComplete() - } - ] - - return OWSTableSection(title: "Profile", items: sectionItems) - } - -} diff --git a/Session/src/ViewControllers/DebugUI/DebugUISessionState.h b/Session/src/ViewControllers/DebugUI/DebugUISessionState.h deleted file mode 100644 index 5c7e257d5..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUISessionState.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIPage.h" - -NS_ASSUME_NONNULL_BEGIN - -@class TSContactThread; - -@interface DebugUISessionState : DebugUIPage - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUISessionState.m b/Session/src/ViewControllers/DebugUI/DebugUISessionState.m deleted file mode 100644 index cc13af0ea..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUISessionState.m +++ /dev/null @@ -1,141 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "DebugUISessionState.h" -#import "OWSTableViewController.h" -#import "Session-Swift.h" -#import -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@implementation DebugUISessionState - -- (NSString *)name -{ - return @"Session State"; -} - -- (nullable OWSTableSection *)sectionForThread:(nullable TSThread *)threadParameter -{ - NSMutableArray *items = [NSMutableArray new]; - if ([threadParameter isKindOfClass:[TSContactThread class]]) { - TSContactThread *thread = (TSContactThread *)threadParameter; - [items addObjectsFromArray:@[ - [OWSTableItem itemWithTitle:@"Log All Recipient Identities" - actionBlock:^{ - [OWSRecipientIdentity printAllIdentities]; - }], - [OWSTableItem itemWithTitle:@"Log All Sessions" - actionBlock:^{ - [[OWSPrimaryStorage sharedManager] printAllSessions]; - }], - [OWSTableItem itemWithTitle:@"Toggle Key Change" - actionBlock:^{ - OWSLogError(@"Flipping identity Key. Flip again to return."); - - OWSIdentityManager *identityManager = [OWSIdentityManager sharedManager]; - NSString *recipientId = [thread contactIdentifier]; - - NSData *currentKey = [identityManager identityKeyForRecipientId:recipientId]; - NSMutableData *flippedKey = [NSMutableData new]; - const char *currentKeyBytes = currentKey.bytes; - for (NSUInteger i = 0; i < currentKey.length; i++) { - const char xorByte = currentKeyBytes[i] ^ 0xff; - [flippedKey appendBytes:&xorByte length:1]; - } - OWSAssertDebug(flippedKey.length == currentKey.length); - [identityManager saveRemoteIdentity:flippedKey recipientId:recipientId]; - }], - [OWSTableItem itemWithTitle:@"Delete all sessions" - actionBlock:^{ - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [[OWSPrimaryStorage sharedManager] - deleteAllSessionsForContact:thread.contactIdentifier - protocolContext:transaction]; - }]; - }], - [OWSTableItem itemWithTitle:@"Archive all sessions" - actionBlock:^{ - [self.dbConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [[OWSPrimaryStorage sharedManager] - archiveAllSessionsForContact:thread.contactIdentifier - protocolContext:transaction]; - }]; - }], - [OWSTableItem itemWithTitle:@"Send session reset" - actionBlock:^{ - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [self.sessionResetJobQueue addContactThread:thread transaction:transaction]; - }]; - }], - ]]; - } - -#if DEBUG - [items addObjectsFromArray:@[ - [OWSTableItem itemWithTitle:@"Clear Session and Identity Store" - actionBlock:^{ - [DebugUISessionState clearSessionAndIdentityStore]; - }], - [OWSTableItem itemWithTitle:@"Snapshot Session and Identity Store" - actionBlock:^{ - [DebugUISessionState snapshotSessionAndIdentityStore]; - }], - [OWSTableItem itemWithTitle:@"Restore Session and Identity Store" - actionBlock:^{ - [DebugUISessionState restoreSessionAndIdentityStore]; - }] - ]]; -#endif - - return [OWSTableSection sectionWithTitle:self.name items:items]; -} - -#pragma mark - Dependencies - -- (OWSSessionResetJobQueue *)sessionResetJobQueue -{ - return AppEnvironment.shared.sessionResetJobQueue; -} - -- (YapDatabaseConnection *)dbConnection -{ - return SSKEnvironment.shared.primaryStorage.dbReadWriteConnection; -} - -#if DEBUG -+ (void)clearSessionAndIdentityStore -{ - [OWSPrimaryStorage.sharedManager.newDatabaseConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [[OWSPrimaryStorage sharedManager] resetSessionStore:transaction]; - [[OWSIdentityManager sharedManager] clearIdentityState:transaction]; - }]; -} - -+ (void)snapshotSessionAndIdentityStore -{ - [OWSPrimaryStorage.sharedManager.newDatabaseConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [[OWSPrimaryStorage sharedManager] snapshotSessionStore:transaction]; - [[OWSIdentityManager sharedManager] snapshotIdentityState:transaction]; - }]; -} - -+ (void)restoreSessionAndIdentityStore -{ - [OWSPrimaryStorage.sharedManager.newDatabaseConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [[OWSPrimaryStorage sharedManager] restoreSessionStore:transaction]; - [[OWSIdentityManager sharedManager] restoreIdentityState:transaction]; - }]; -} -#endif - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIStress.h b/Session/src/ViewControllers/DebugUI/DebugUIStress.h deleted file mode 100644 index 6a9aa1dbe..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIStress.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIPage.h" - -NS_ASSUME_NONNULL_BEGIN - -@class TSThread; - -@interface DebugUIStress : DebugUIPage - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUIStress.m b/Session/src/ViewControllers/DebugUI/DebugUIStress.m deleted file mode 100644 index 73ec756fc..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUIStress.m +++ /dev/null @@ -1,580 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIStress.h" -#import "OWSMessageSender.h" -#import "OWSTableViewController.h" -#import "SignalApp.h" -#import "ThreadUtil.h" -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@implementation DebugUIStress - -#pragma mark - Dependencies - -+ (SSKMessageSenderJobQueue *)messageSenderJobQueue -{ - return SSKEnvironment.shared.messageSenderJobQueue; -} - -- (SSKMessageSenderJobQueue *)messageSenderJobQueue -{ - return self.class.messageSenderJobQueue; -} - -- (YapDatabaseConnection *)dbConnection -{ - return self.class.dbConnection; -} - -+ (YapDatabaseConnection *)dbConnection -{ - return SSKEnvironment.shared.primaryStorage.dbReadWriteConnection; -} - -+ (TSAccountManager *)tsAccountManager -{ - return TSAccountManager.sharedInstance; -} - -#pragma mark - Factory Methods - -- (NSString *)name -{ - return @"Stress"; -} - -- (nullable OWSTableSection *)sectionForThread:(nullable TSThread *)thread -{ - OWSAssertDebug(thread); - - NSMutableArray *items = [NSMutableArray new]; - -#ifdef DEBUG - - [items addObject:[OWSTableItem itemWithTitle:@"Send empty message" - actionBlock:^{ - [DebugUIStress sendStressMessage:thread block:^(SignalRecipient *recipient) { - return [NSData new]; - }]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Send random noise message" - actionBlock:^{ - [DebugUIStress - sendStressMessage:thread - block:^(SignalRecipient *recipient) { - NSUInteger contentLength = arc4random_uniform(32); - return [Cryptography generateRandomBytes:contentLength]; - }]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Send no payload message" - actionBlock:^{ - [DebugUIStress sendStressMessage:thread - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = - [SSKProtoContent builder]; - return [[contentBuilder buildIgnoringErrors] - serializedDataIgnoringErrors]; - }]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Send empty null message" - actionBlock:^{ - [DebugUIStress sendStressMessage:thread - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = - [SSKProtoContent builder]; - SSKProtoNullMessageBuilder *nullMessageBuilder = - [SSKProtoNullMessage builder]; - contentBuilder.nullMessage = - [nullMessageBuilder buildIgnoringErrors]; - return [[contentBuilder buildIgnoringErrors] - serializedDataIgnoringErrors]; - }]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Send random null message" - actionBlock:^{ - [DebugUIStress - sendStressMessage:thread - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = - [SSKProtoContent builder]; - SSKProtoNullMessageBuilder *nullMessageBuilder = - [SSKProtoNullMessage builder]; - NSUInteger contentLength = arc4random_uniform(32); - nullMessageBuilder.padding = - [Cryptography generateRandomBytes:contentLength]; - contentBuilder.nullMessage = - [nullMessageBuilder buildIgnoringErrors]; - return [[contentBuilder buildIgnoringErrors] - serializedDataIgnoringErrors]; - }]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Send empty sync message" - actionBlock:^{ - [DebugUIStress sendStressMessage:thread - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = - [SSKProtoContent builder]; - SSKProtoSyncMessageBuilder *syncMessageBuilder = - [SSKProtoSyncMessage builder]; - contentBuilder.syncMessage = - [syncMessageBuilder buildIgnoringErrors]; - return [[contentBuilder buildIgnoringErrors] - serializedDataIgnoringErrors]; - }]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Send empty sync sent message" - actionBlock:^{ - [DebugUIStress sendStressMessage:thread - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = - [SSKProtoContent builder]; - SSKProtoSyncMessageBuilder *syncMessageBuilder = - [SSKProtoSyncMessage builder]; - SSKProtoSyncMessageSentBuilder *sentBuilder = - [SSKProtoSyncMessageSent builder]; - syncMessageBuilder.sent = - [sentBuilder buildIgnoringErrors]; - contentBuilder.syncMessage = - [syncMessageBuilder buildIgnoringErrors]; - return [[contentBuilder buildIgnoringErrors] - serializedDataIgnoringErrors]; - }]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Send whitespace text data message" - actionBlock:^{ - [DebugUIStress - sendStressMessage:thread - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = - [SSKProtoContent builder]; - SSKProtoDataMessageBuilder *dataBuilder = - [SSKProtoDataMessage builder]; - dataBuilder.body = @" "; - [DebugUIStress ensureGroupOfDataBuilder:dataBuilder - thread:thread]; - contentBuilder.dataMessage = - [dataBuilder buildIgnoringErrors]; - return [[contentBuilder buildIgnoringErrors] - serializedDataIgnoringErrors]; - }]; - }]]; - [items - addObject:[OWSTableItem - itemWithTitle:@"Send bad attachment data message" - actionBlock:^{ - [DebugUIStress - sendStressMessage:thread - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = [SSKProtoContent builder]; - SSKProtoDataMessageBuilder *dataBuilder = [SSKProtoDataMessage builder]; - SSKProtoAttachmentPointerBuilder *attachmentPointer = - [SSKProtoAttachmentPointer - builderWithId:arc4random_uniform(32) + 1]; - [attachmentPointer setContentType:@"1"]; - [attachmentPointer setSize:arc4random_uniform(32) + 1]; - [attachmentPointer setDigest:[Cryptography generateRandomBytes:1]]; - [attachmentPointer setFileName:@" "]; - [DebugUIStress ensureGroupOfDataBuilder:dataBuilder thread:thread]; - contentBuilder.dataMessage = [dataBuilder buildIgnoringErrors]; - return - [[contentBuilder buildIgnoringErrors] serializedDataIgnoringErrors]; - }]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Send normal text data message" - actionBlock:^{ - [DebugUIStress - sendStressMessage:thread - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = - [SSKProtoContent builder]; - SSKProtoDataMessageBuilder *dataBuilder = - [SSKProtoDataMessage builder]; - dataBuilder.body = @"alice"; - [DebugUIStress ensureGroupOfDataBuilder:dataBuilder - thread:thread]; - contentBuilder.dataMessage = - [dataBuilder buildIgnoringErrors]; - return [[contentBuilder buildIgnoringErrors] - serializedDataIgnoringErrors]; - }]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Send N text messages with same timestamp" - actionBlock:^{ - uint64_t timestamp = [NSDate ows_millisecondTimeStamp]; - for (int i = 0; i < 3; i++) { - [DebugUIStress - sendStressMessage:thread - timestamp:timestamp - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = - [SSKProtoContent builder]; - SSKProtoDataMessageBuilder *dataBuilder = - [SSKProtoDataMessage builder]; - dataBuilder.body = [NSString stringWithFormat:@"%@ %d", - [NSUUID UUID].UUIDString, - i]; - [DebugUIStress ensureGroupOfDataBuilder:dataBuilder - thread:thread]; - contentBuilder.dataMessage = - [dataBuilder buildIgnoringErrors]; - return [[contentBuilder buildIgnoringErrors] - serializedDataIgnoringErrors]; - }]; - } - }]]; - [items addObject:[OWSTableItem - itemWithTitle:@"Send text message with current timestamp" - actionBlock:^{ - uint64_t timestamp = [NSDate ows_millisecondTimeStamp]; - [DebugUIStress - sendStressMessage:thread - timestamp:timestamp - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = [SSKProtoContent builder]; - SSKProtoDataMessageBuilder *dataBuilder = - [SSKProtoDataMessage builder]; - dataBuilder.body = - [[NSUUID UUID].UUIDString stringByAppendingString:@" now"]; - [DebugUIStress ensureGroupOfDataBuilder:dataBuilder thread:thread]; - contentBuilder.dataMessage = [dataBuilder buildIgnoringErrors]; - return [[contentBuilder buildIgnoringErrors] - serializedDataIgnoringErrors]; - }]; - }]]; - [items addObject:[OWSTableItem - itemWithTitle:@"Send text message with future timestamp" - actionBlock:^{ - uint64_t timestamp = [NSDate ows_millisecondTimeStamp]; - timestamp += kHourInMs; - [DebugUIStress - sendStressMessage:thread - timestamp:timestamp - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = [SSKProtoContent builder]; - SSKProtoDataMessageBuilder *dataBuilder = - [SSKProtoDataMessage builder]; - dataBuilder.body = - [[NSUUID UUID].UUIDString stringByAppendingString:@" now"]; - [DebugUIStress ensureGroupOfDataBuilder:dataBuilder thread:thread]; - contentBuilder.dataMessage = [dataBuilder buildIgnoringErrors]; - return [[contentBuilder buildIgnoringErrors] - serializedDataIgnoringErrors]; - }]; - }]]; - [items addObject:[OWSTableItem - itemWithTitle:@"Send text message with past timestamp" - actionBlock:^{ - uint64_t timestamp = [NSDate ows_millisecondTimeStamp]; - timestamp -= kHourInMs; - [DebugUIStress - sendStressMessage:thread - timestamp:timestamp - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = [SSKProtoContent builder]; - SSKProtoDataMessageBuilder *dataBuilder = - [SSKProtoDataMessage builder]; - dataBuilder.body = - [[NSUUID UUID].UUIDString stringByAppendingString:@" now"]; - [DebugUIStress ensureGroupOfDataBuilder:dataBuilder thread:thread]; - contentBuilder.dataMessage = [dataBuilder buildIgnoringErrors]; - return [[contentBuilder buildIgnoringErrors] - serializedDataIgnoringErrors]; - }]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Send N text messages with same timestamp" - actionBlock:^{ - SSKProtoContentBuilder *contentBuilder = [SSKProtoContent builder]; - SSKProtoDataMessageBuilder *dataBuilder = [SSKProtoDataMessage builder]; - dataBuilder.body = @"alice"; - contentBuilder.dataMessage = [dataBuilder buildIgnoringErrors]; - [DebugUIStress ensureGroupOfDataBuilder:dataBuilder thread:thread]; - NSData *data = - [[contentBuilder buildIgnoringErrors] serializedDataIgnoringErrors]; - - uint64_t timestamp = [NSDate ows_millisecondTimeStamp]; - - for (int i = 0; i < 3; i++) { - [DebugUIStress sendStressMessage:thread - timestamp:timestamp - block:^(SignalRecipient *recipient) { - return data; - }]; - } - }]]; - [items - addObject:[OWSTableItem - itemWithTitle:@"Send malformed sync sent message 1" - actionBlock:^{ - [DebugUIStress - sendStressMessage:thread - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = [SSKProtoContent builder]; - SSKProtoSyncMessageBuilder *syncMessageBuilder = - [SSKProtoSyncMessage builder]; - SSKProtoSyncMessageSentBuilder *sentBuilder = - [SSKProtoSyncMessageSent builder]; - sentBuilder.destination = @"abc"; - sentBuilder.timestamp = arc4random_uniform(32) + 1; - SSKProtoDataMessageBuilder *dataBuilder = [SSKProtoDataMessage builder]; - sentBuilder.message = [dataBuilder buildIgnoringErrors]; - syncMessageBuilder.sent = [sentBuilder buildIgnoringErrors]; - contentBuilder.syncMessage = [syncMessageBuilder buildIgnoringErrors]; - return - [[contentBuilder buildIgnoringErrors] serializedDataIgnoringErrors]; - }]; - }]]; - [items - addObject:[OWSTableItem - itemWithTitle:@"Send malformed sync sent message 2" - actionBlock:^{ - [DebugUIStress - sendStressMessage:thread - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = [SSKProtoContent builder]; - SSKProtoSyncMessageBuilder *syncMessageBuilder = - [SSKProtoSyncMessage builder]; - SSKProtoSyncMessageSentBuilder *sentBuilder = - [SSKProtoSyncMessageSent builder]; - sentBuilder.destination = @"abc"; - sentBuilder.timestamp = 0; - SSKProtoDataMessageBuilder *dataBuilder = [SSKProtoDataMessage builder]; - sentBuilder.message = [dataBuilder buildIgnoringErrors]; - syncMessageBuilder.sent = [sentBuilder buildIgnoringErrors]; - contentBuilder.syncMessage = [syncMessageBuilder buildIgnoringErrors]; - return - [[contentBuilder buildIgnoringErrors] serializedDataIgnoringErrors]; - }]; - }]]; - [items - addObject:[OWSTableItem - itemWithTitle:@"Send malformed sync sent message 3" - actionBlock:^{ - [DebugUIStress - sendStressMessage:thread - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = [SSKProtoContent builder]; - SSKProtoSyncMessageBuilder *syncMessageBuilder = - [SSKProtoSyncMessage builder]; - SSKProtoSyncMessageSentBuilder *sentBuilder = - [SSKProtoSyncMessageSent builder]; - sentBuilder.destination = @"abc"; - sentBuilder.timestamp = 0; - SSKProtoDataMessageBuilder *dataBuilder = [SSKProtoDataMessage builder]; - dataBuilder.body = @" "; - sentBuilder.message = [dataBuilder buildIgnoringErrors]; - syncMessageBuilder.sent = [sentBuilder buildIgnoringErrors]; - contentBuilder.syncMessage = [syncMessageBuilder buildIgnoringErrors]; - return - [[contentBuilder buildIgnoringErrors] serializedDataIgnoringErrors]; - }]; - }]]; - [items - addObject:[OWSTableItem - itemWithTitle:@"Send malformed sync sent message 4" - actionBlock:^{ - [DebugUIStress - sendStressMessage:thread - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = [SSKProtoContent builder]; - SSKProtoSyncMessageBuilder *syncMessageBuilder = - [SSKProtoSyncMessage builder]; - SSKProtoSyncMessageSentBuilder *sentBuilder = - [SSKProtoSyncMessageSent builder]; - sentBuilder.destination = @"abc"; - sentBuilder.timestamp = 0; - SSKProtoDataMessageBuilder *dataBuilder = [SSKProtoDataMessage builder]; - dataBuilder.body = @" "; - SSKProtoGroupContextBuilder *groupBuilder = [SSKProtoGroupContext - builderWithId:[Cryptography generateRandomBytes:1] - type:SSKProtoGroupContextTypeDeliver]; - dataBuilder.group = [groupBuilder buildIgnoringErrors]; - sentBuilder.message = [dataBuilder buildIgnoringErrors]; - syncMessageBuilder.sent = [sentBuilder buildIgnoringErrors]; - contentBuilder.syncMessage = [syncMessageBuilder buildIgnoringErrors]; - return - [[contentBuilder buildIgnoringErrors] serializedDataIgnoringErrors]; - }]; - }]]; - [items - addObject:[OWSTableItem - itemWithTitle:@"Send malformed sync sent message 5" - actionBlock:^{ - [DebugUIStress - sendStressMessage:thread - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = [SSKProtoContent builder]; - SSKProtoSyncMessageBuilder *syncMessageBuilder = - [SSKProtoSyncMessage builder]; - SSKProtoSyncMessageSentBuilder *sentBuilder = - [SSKProtoSyncMessageSent builder]; - sentBuilder.destination = @"abc"; - sentBuilder.timestamp = 0; - SSKProtoDataMessageBuilder *dataBuilder = [SSKProtoDataMessage builder]; - dataBuilder.body = @" "; - SSKProtoGroupContextBuilder *groupBuilder = [SSKProtoGroupContext - builderWithId:[Cryptography generateRandomBytes:1] - type:SSKProtoGroupContextTypeDeliver]; - dataBuilder.group = [groupBuilder buildIgnoringErrors]; - sentBuilder.message = [dataBuilder buildIgnoringErrors]; - syncMessageBuilder.sent = [sentBuilder buildIgnoringErrors]; - contentBuilder.syncMessage = [syncMessageBuilder buildIgnoringErrors]; - return - [[contentBuilder buildIgnoringErrors] serializedDataIgnoringErrors]; - }]; - }]]; - [items addObject:[OWSTableItem itemWithTitle:@"Send empty sync sent message 6" - actionBlock:^{ - [DebugUIStress sendStressMessage:thread - block:^(SignalRecipient *recipient) { - SSKProtoContentBuilder *contentBuilder = - [SSKProtoContent builder]; - SSKProtoSyncMessageBuilder *syncMessageBuilder = - [SSKProtoSyncMessage builder]; - SSKProtoSyncMessageSentBuilder *sentBuilder = - [SSKProtoSyncMessageSent builder]; - sentBuilder.destination = @"abc"; - syncMessageBuilder.sent = - [sentBuilder buildIgnoringErrors]; - contentBuilder.syncMessage = - [syncMessageBuilder buildIgnoringErrors]; - return [[contentBuilder buildIgnoringErrors] - serializedDataIgnoringErrors]; - }]; - }]]; - - if ([thread isKindOfClass:[TSGroupThread class]]) { - TSGroupThread *groupThread = (TSGroupThread *)thread; - [items addObject:[OWSTableItem itemWithTitle:@"Hallucinate twin group" - actionBlock:^{ - [DebugUIStress hallucinateTwinGroup:groupThread]; - }]]; - } - - [items addObject:[OWSTableItem itemWithTitle:@"Make group w. unregistered users" - actionBlock:^{ - [DebugUIStress makeUnregisteredGroup]; - }]]; - -#endif - - return [OWSTableSection sectionWithTitle:self.name items:items]; -} - -#ifdef DEBUG - -+ (void)ensureGroupOfDataBuilder:(SSKProtoDataMessageBuilder *)dataBuilder thread:(TSThread *)thread -{ - OWSAssertDebug(dataBuilder); - OWSAssertDebug(thread); - - if (![thread isKindOfClass:[TSGroupThread class]]) { - return; - } - - TSGroupThread *groupThread = (TSGroupThread *)thread; - SSKProtoGroupContextBuilder *groupBuilder = - [SSKProtoGroupContext builderWithId:groupThread.groupModel.groupId type:SSKProtoGroupContextTypeDeliver]; - [groupBuilder setId:groupThread.groupModel.groupId]; - [dataBuilder setGroup:groupBuilder.buildIgnoringErrors]; -} - -+ (void)sendStressMessage:(TSOutgoingMessage *)message -{ - OWSAssertDebug(message); - - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { - [self.messageSenderJobQueue addMessage:message transaction:transaction]; - }]; -} - -+ (void)sendStressMessage:(TSThread *)thread - block:(DynamicOutgoingMessageBlock)block -{ - OWSAssertDebug(thread); - OWSAssertDebug(block); - - OWSDynamicOutgoingMessage *message = - [[OWSDynamicOutgoingMessage alloc] initWithPlainTextDataBlock:block thread:thread]; - - [self sendStressMessage:message]; -} - -+ (void)sendStressMessage:(TSThread *)thread timestamp:(uint64_t)timestamp block:(DynamicOutgoingMessageBlock)block -{ - OWSAssertDebug(thread); - OWSAssertDebug(block); - - OWSDynamicOutgoingMessage *message = - [[OWSDynamicOutgoingMessage alloc] initWithPlainTextDataBlock:block timestamp:timestamp thread:thread]; - - [self sendStressMessage:message]; -} - -// Creates a new group (by cloning the current group) without informing the, -// other members. This can be used to test "group info requests", etc. -+ (void)hallucinateTwinGroup:(TSGroupThread *)groupThread -{ - __block TSGroupThread *thread; - [OWSPrimaryStorage.dbReadWriteConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { - TSGroupModel *groupModel = - [[TSGroupModel alloc] initWithTitle:[groupThread.groupModel.groupName stringByAppendingString:@" Copy"] - memberIds:groupThread.groupModel.groupMemberIds - image:groupThread.groupModel.groupImage - groupId:[Randomness generateRandomBytes:kGroupIdLength] - groupType:closedGroup - adminIds:groupThread.groupModel.groupAdminIds]; - thread = [TSGroupThread getOrCreateThreadWithGroupModel:groupModel transaction:transaction]; - }]; - OWSAssertDebug(thread); - - [SignalApp.sharedApp presentConversationForThread:thread animated:YES]; -} - -+ (void)makeUnregisteredGroup -{ - NSMutableArray *recipientIds = [NSMutableArray new]; - for (int i = 0; i < 3; i++) { - NSMutableString *recipientId = [@"+1999" mutableCopy]; - for (int j = 0; j < 3; j++) { - uint32_t digit = arc4random_uniform(10); - [recipientId appendFormat:@"%d", (int)digit]; - } - [recipientIds addObject:recipientId]; - } - [recipientIds addObject:self.tsAccountManager.localNumber]; - - __block TSGroupThread *thread; - [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^( - YapDatabaseReadWriteTransaction *_Nonnull transaction) { - TSGroupModel *groupModel = [[TSGroupModel alloc] initWithTitle:NSUUID.UUID.UUIDString - memberIds:recipientIds - image:nil - groupId:[Randomness generateRandomBytes:kGroupIdLength] - groupType:closedGroup adminIds:@[ self.tsAccountManager.localNumber ]]; - thread = [TSGroupThread getOrCreateThreadWithGroupModel:groupModel transaction:transaction]; - }]; - OWSAssertDebug(thread); - - [SignalApp.sharedApp presentConversationForThread:thread animated:YES]; -} - -#endif - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUISyncMessages.h b/Session/src/ViewControllers/DebugUI/DebugUISyncMessages.h deleted file mode 100644 index c9d7f5776..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUISyncMessages.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIPage.h" - -NS_ASSUME_NONNULL_BEGIN - -@class TSThread; - -@interface DebugUISyncMessages : DebugUIPage - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUISyncMessages.m b/Session/src/ViewControllers/DebugUI/DebugUISyncMessages.m deleted file mode 100644 index 356a2ebe4..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUISyncMessages.m +++ /dev/null @@ -1,126 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "DebugUISyncMessages.h" -#import "DebugUIContacts.h" -#import "OWSTableViewController.h" -#import "Session-Swift.h" -#import "ThreadUtil.h" -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@implementation DebugUISyncMessages - -#pragma mark - Factory Methods - -- (NSString *)name -{ - return @"Sync Messages"; -} - -- (nullable OWSTableSection *)sectionForThread:(nullable TSThread *)thread -{ - NSArray *items = @[ - [OWSTableItem itemWithTitle:@"Send Contacts Sync Message" - actionBlock:^{ - [DebugUISyncMessages sendContactsSyncMessage]; - }], - [OWSTableItem itemWithTitle:@"Send Groups Sync Message" - actionBlock:^{ - [DebugUISyncMessages sendGroupSyncMessage]; - }], - [OWSTableItem itemWithTitle:@"Send Blocklist Sync Message" - actionBlock:^{ - [DebugUISyncMessages sendBlockListSyncMessage]; - }], - [OWSTableItem itemWithTitle:@"Send Configuration Sync Message" - actionBlock:^{ - [DebugUISyncMessages sendConfigurationSyncMessage]; - }], - ]; - return [OWSTableSection sectionWithTitle:self.name items:items]; -} - -+ (SSKMessageSenderJobQueue *)messageSenderJobQueue -{ - return SSKEnvironment.shared.messageSenderJobQueue; -} - -+ (OWSContactsManager *)contactsManager -{ - return Environment.shared.contactsManager; -} - -+ (OWSIdentityManager *)identityManager -{ - return [OWSIdentityManager sharedManager]; -} - -+ (OWSBlockingManager *)blockingManager -{ - return [OWSBlockingManager sharedManager]; -} - -+ (OWSProfileManager *)profileManager -{ - return [OWSProfileManager sharedManager]; -} - -+ (YapDatabaseConnection *)dbConnection -{ - return [OWSPrimaryStorage.sharedManager newDatabaseConnection]; -} - -+ (id)syncManager -{ - OWSAssertDebug(SSKEnvironment.shared.syncManager); - - return SSKEnvironment.shared.syncManager; -} - -#pragma mark - - -+ (void)sendContactsSyncMessage -{ - [[self.syncManager syncAllContacts] retainUntilComplete]; -} - -+ (void)sendGroupSyncMessage -{ - [[self.syncManager syncAllGroups] retainUntilComplete]; -} - -+ (void)sendBlockListSyncMessage -{ - [self.blockingManager syncBlockList]; -} - -+ (void)sendConfigurationSyncMessage -{ - [SSKEnvironment.shared.syncManager sendConfigurationSyncMessage]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUITableViewController.h b/Session/src/ViewControllers/DebugUI/DebugUITableViewController.h deleted file mode 100644 index 12ad42344..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUITableViewController.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. -// - -#import "DebugUIPage.h" -#import "OWSTableViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -@class TSThread; - -@interface DebugUITableViewController : OWSTableViewController - -+ (void)presentDebugUIFromViewController:(UIViewController *)fromViewController; - -+ (void)presentDebugUIForThread:(TSThread *)thread fromViewController:(UIViewController *)fromViewController; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/src/ViewControllers/DebugUI/DebugUITableViewController.m b/Session/src/ViewControllers/DebugUI/DebugUITableViewController.m deleted file mode 100644 index 839a274da..000000000 --- a/Session/src/ViewControllers/DebugUI/DebugUITableViewController.m +++ /dev/null @@ -1,152 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "DebugUITableViewController.h" -#import "DebugUIBackup.h" -#import "DebugUIContacts.h" -#import "DebugUIDiskUsage.h" -#import "DebugUIMessages.h" -#import "DebugUIMisc.h" -#import "DebugUISessionState.h" -#import "DebugUIStress.h" -#import "DebugUISyncMessages.h" -#import "Session-Swift.h" -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@implementation DebugUITableViewController - -- (void)viewWillAppear:(BOOL)animated -{ - [super viewWillAppear:animated]; - - // Block device from sleeping while in the Debug UI. - // - // This is useful if you're using long-running actions in the - // Debug UI, like "send 1k messages", etc. - [DeviceSleepManager.sharedInstance addBlockWithBlockObject:self]; -} - -- (void)viewWillDisappear:(BOOL)animated -{ - [super viewWillDisappear:animated]; - - [DeviceSleepManager.sharedInstance removeBlockWithBlockObject:self]; -} - -#pragma mark - Factory Methods - -- (void)pushPageWithSection:(OWSTableSection *)section -{ - DebugUITableViewController *viewController = [DebugUITableViewController new]; - OWSTableContents *contents = [OWSTableContents new]; - contents.title = section.headerTitle; - [contents addSection:section]; - viewController.contents = contents; - [self.navigationController pushViewController:viewController animated:YES]; -} - -+ (OWSTableItem *)itemForSubsection:(DebugUIPage *)page - viewController:(DebugUITableViewController *)viewController - thread:(nullable TSThread *)thread -{ - OWSAssertDebug(page); - OWSAssertDebug(viewController); - - __weak DebugUITableViewController *weakSelf = viewController; - return [OWSTableItem disclosureItemWithText:page.name - actionBlock:^{ - [weakSelf pushPageWithSection:[page sectionForThread:thread]]; - }]; -} - -+ (void)presentDebugUIForThread:(TSThread *)thread fromViewController:(UIViewController *)fromViewController -{ - OWSAssertDebug(thread); - OWSAssertDebug(fromViewController); - - DebugUITableViewController *viewController = [DebugUITableViewController new]; - - OWSTableContents *contents = [OWSTableContents new]; - contents.title = @"Debug: Conversation"; - - NSMutableArray *subsectionItems = [NSMutableArray new]; - - [subsectionItems - addObject:[self itemForSubsection:[DebugUIMessages new] viewController:viewController thread:thread]]; - [subsectionItems - addObject:[self itemForSubsection:[DebugUIContacts new] viewController:viewController thread:thread]]; - [subsectionItems - addObject:[self itemForSubsection:[DebugUIDiskUsage new] viewController:viewController thread:thread]]; - [subsectionItems - addObject:[self itemForSubsection:[DebugUISessionState new] viewController:viewController thread:thread]]; - if ([thread isKindOfClass:[TSContactThread class]]) { - [subsectionItems - addObject:[self itemForSubsection:[DebugUICalling new] viewController:viewController thread:thread]]; - } - [subsectionItems - addObject:[self itemForSubsection:[DebugUINotifications new] viewController:viewController thread:thread]]; - [subsectionItems addObject:[self itemForSubsection:[DebugUIProfile new] viewController:viewController thread:thread]]; - [subsectionItems - addObject:[self itemForSubsection:[DebugUIStress new] viewController:viewController thread:thread]]; - [subsectionItems - addObject:[self itemForSubsection:[DebugUISyncMessages new] viewController:viewController thread:thread]]; - OWSTableItem *sharedDataFileBrowserItem = [OWSTableItem - disclosureItemWithText:@"📁 Shared Container" - actionBlock:^{ - NSURL *baseURL = [NSURL URLWithString:[OWSFileSystem appSharedDataDirectoryPath]]; - DebugUIFileBrowser *fileBrowser = [[DebugUIFileBrowser alloc] initWithFileURL:baseURL]; - [viewController.navigationController pushViewController:fileBrowser animated:YES]; - }]; - [subsectionItems addObject:sharedDataFileBrowserItem]; - OWSTableItem *documentsFileBrowserItem = [OWSTableItem - disclosureItemWithText:@"📁 App Container" - actionBlock:^{ - NSString *libraryPath = [OWSFileSystem appLibraryDirectoryPath]; - NSString *containerPath = [libraryPath stringByDeletingLastPathComponent]; - NSURL *baseURL = [NSURL fileURLWithPath:containerPath]; - DebugUIFileBrowser *fileBrowser = [[DebugUIFileBrowser alloc] initWithFileURL:baseURL]; - [viewController.navigationController pushViewController:fileBrowser animated:YES]; - }]; - [subsectionItems addObject:documentsFileBrowserItem]; - [subsectionItems - addObject:[self itemForSubsection:[DebugUIBackup new] viewController:viewController thread:thread]]; - [subsectionItems addObject:[self itemForSubsection:[DebugUIMisc new] viewController:viewController thread:thread]]; - - [contents addSection:[OWSTableSection sectionWithTitle:@"Sections" items:subsectionItems]]; - - viewController.contents = contents; - [viewController presentFromViewController:fromViewController]; -} - -+ (void)presentDebugUIFromViewController:(UIViewController *)fromViewController -{ - OWSAssertDebug(fromViewController); - - DebugUITableViewController *viewController = [DebugUITableViewController new]; - - OWSTableContents *contents = [OWSTableContents new]; - contents.title = @"Debug UI"; - - NSMutableArray *subsectionItems = [NSMutableArray new]; - [subsectionItems addObject:[self itemForSubsection:[DebugUIContacts new] viewController:viewController thread:nil]]; - [subsectionItems - addObject:[self itemForSubsection:[DebugUIDiskUsage new] viewController:viewController thread:nil]]; - [subsectionItems - addObject:[self itemForSubsection:[DebugUISessionState new] viewController:viewController thread:nil]]; - [subsectionItems - addObject:[self itemForSubsection:[DebugUISyncMessages new] viewController:viewController thread:nil]]; - [subsectionItems addObject:[self itemForSubsection:[DebugUIBackup new] viewController:viewController thread:nil]]; - [subsectionItems addObject:[self itemForSubsection:[DebugUIMisc new] viewController:viewController thread:nil]]; - [contents addSection:[OWSTableSection sectionWithTitle:@"Sections" items:subsectionItems]]; - - viewController.contents = contents; - [viewController presentFromViewController:fromViewController]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/test/Assets/test-gif.gif b/Session/test/Assets/test-gif.gif deleted file mode 100644 index 0dcdebc805febe224359d368cacde64b93522333..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 690760 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
    tA(i~ly{%FV?gavNp>%0WoZG3HS^Q$j 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 z z{QvO7-hcnyH{UELGoGHBMIJ zl=Ua9Y_0m%F|D3#S29r&6D71~LJ3}nG(vGnfAs!`9)9?tnI3hx%?8|GApg-7TgdJF z^LaBt_Y`zXPyH0nXD_$%9(|O28sLWy{@RcKVUG@lBVXnlcAPP36m zTHYTxna>mD$AdTgph#i7rz|+j{hNp)&Xyy&YYg+_AvV|>Bu!0uEU(r))!}0>%oxQ;vOBrd#V&Wj%PW+FK4-0ueS*?a`~MmT zjrrNbi1druqvjD0NXbKg{NW!p?h&pp_-${|V?qeE_=LK3F@z!PAO}5ILb+A&3n%m* z7}n^v7BUcq9it%)EoKt9L@Z)q2@51H;SxT+#E+MV2~1!oNU_bt6bIWyae648AGS|r zsfa~0kXWB;QOiCxJJJ)O=otP(W=w)LOsb%cDNVV_QVhmSR^aIseDd6`1XibA*os-_OP@6X zW*#9vl0B)U;TvmnI`Qi#zcCmZ8QP_hAUS5ToyY^h6L@{)G4^F%&{$^XyQeIgWC zOGPtZVT+*TNnq5h=6HU%zF|OwRuHw0oFrPEg-|p_(os%t&IirJS@S$PQs_5#k%~(g zgOcPF(h`~2M8o9oiAp+$DWGwWVPxhbbr1+7$|946DeH6r%?auZc2I$phoQe1MnaUT z5Edz?8O%wJh^9K#;#l>nSFLJR-L#yk!s)5bfvR-IO4eayRHHEBsIzVa(q}nsJa07* z)=rvIMNw-=nQWq#&cTXi)D#kfm?vH~rKcYAP+OaYxt-BzoM@I^+NdFF_u6Dg^VOk0) zP4*`ptT4u339*?y&SV&id1*Rb`b3-g=Ty*5$IzxrwAfgeRkESYXF=;&Y}m^;rQK+F zPwOVGs#aF5b?sT9F&k*acC9w@CT&SdqsZY_iTBfwZ@Fa);SS>x#BGGnIK_@i;6{3+OS5MpqHAsk`MPS`dUhU|rn#-Xg{i?tA4pNVml ztIruU7SQxb$XEN)=W$=jwHSZNU8g*3b&naRB>#}HI7j^Chf-@H*rmSh z7IcYRWY~B^v$M&tc%_=0I5DI;+#HWBa6vFEC#4lismiZr!Z1II#S>%6w5Bz^l~|DW zz3MCRNWJOJSwu1z^Qg1r?7`xd9;T&Dd@*Be5sZ5@gT_9KMPK%Tu5;B#TS6{PksX^_ zLnmZ?51|D@_0&vOAo3K%GGti*nQ5?GVyBqEAxki}u|#kThAdp63fXW4LO}Jsq89Zd zhTSWdjC7Q%2#d#9q8fQufT=6PfRHJ zQW+Pf=u@h9Y`?tPd%qD%&pevpiM2c;6J1-K!B7{9P^iw3w!0ne^ohHT4^L#`1|J2N zSH?18k0V*k8{Sl2H@wxYde^(&+^E+*@1Zb-a5tVDGQq=`t9$10Wovo7>4})fL)AfQ z^_A}IV;JLN9@4mk9+D?P7CO-55iFkf%xFfElaP5N?_k)Y2ROi8(Qkh%`{uo9y)tU> zd*TbX>PHg8jcLpzB{@k+woUtsH^Onyz(vgGtM|RDXBL_8d%Uk?XBX!$!Tt$`E#^TD zPt>91I*7jXf8c}BTVIQI1LGCgUP8BfKZUAa;s4cJ|9Xt=4u`zF__gy=?LUGg;xh?o z$#QRZ-jj#j_a{&Aaq;&u59yrt_G$r$XZtk_ufTlH#{^fTMa%;d#uE~bH#{OCOIMdM zBM~y@w{aH}dx>xeiQpD(adGy9M|mU`FF{BQlNDF-D?!Cf1%ngOq$^Kj9!lk1^e1!V zfp_`WRy&9u?STvX*MGQ0e6DtUujXSfWef+{e0{Ke@gx!fG=g_DaTAvpRCq^ZAr`X3 zM|*S$v=bKl^b+tlOi!T{K~YfBBu#o!C)H$F5G5xK5r@Vg9SpHvFwzY-sDnIse>l>E zxblOUzzVP6DZ@8-y(NH(;aiqt46HB@*#A&;<3ke06%(gmNKLmjO&1C`5el9#RLv%c zLxE7VKnt_LJ`80mhgFAUbs~x-A{=&Fu83OHpd2IOVPWN3%~4wIrF$QBR6hu2e`p?o z$O`EIc=UlSXI42#qCfG#4#sc_^H2>%w>CO86T#q$i{&P5f??cfG?3+3yAfGN;|-EU zj-eHfp4C~O^;q>1ju_S@$& zgolLr!w$}13i1FTHKqqD;R&Y@4Ds-5ca~0t2N{b2U6CPOLj#f$1`dB#Sr)=sWs+n{ zresXEQPn_R+1Mst)g1X^k1wJd(Enfy`zU347>xNRL;$HHP=g+jfMs$PZ-hZ+jgnsk z_+ysi44&|irtk=o7)ZF_Df+-`b4E_{W_%mzk?bH{=`fblHIgK08`YqWo@FoJ*p0t& zFRvJv(9nvil~GXDCcDuLI?0bS$8I6jhi+9Kkl+*Gun$Nn81z678Hpqb=3|M6GoC<| zj}Q~K01jEX4_dimd4+^RCL!lAmLS<@u`vy^fDG1v45e9`$lwdufg9Fvj_=qT_d;5x zrH#@+R&y9->%)f2R!~OKU)7+OJ1J$o=!3o&X7~q~KDl>;`3i-3nD&sEtkz@q)|C45 znBXv#n!*aZhMBx}M1_by3jf)es6m#~)eVg09n3iLTK9C@Y z-e8QCB%SnzPK{Z3@lXwyfHS5bF2Qw~T8S=$5uzFiWFHBd<6vEr#bny394+!Rx>N{R zkOghf26B)EH*f<$aHL0i1WI}YSRe;;U6BC-o5-SmcZ*dZ?w=r;p zb!!tolec|!g9+3Sp|8M?-6T@z0hB@cra7{quh5~;DHzyNokysUK2{Bozz*P$3WP8S z8+wfgXAB4zho^{ai~lAtF9>PPL`+~4b&Bu?RImg%P^2!v0-SmSn`#0k5CSeRsxIKE zMG6E=iUm#31XS>&bD#*mvp_3!JR_F|*^@;qH#oVvt2$r=Xd0oMLY&1JjBNOqL1dwD zwF?^>3*F$Mbwx9=#;4KxMBVTR55@|Fzy^Ad2xYNPVk33ndOK2hM;n(rim(WBUE4Z+%)NrSGs$WKEo%sU}j{pwrfUQ@6MRG$%800)2 zlzn8>vS3uRA^)@lPp|}X@CQT6u0Y_a?`i=;3$Gtw0U&^{L~8*R-~mPZ03W~tNE@## za08iosz=bOR3HbBH#}e3wE;AH+NKhAk)V(e48f_74z(l2+NN&0oN~&sjo?hu0J6$B zfFtT--~b6I%L;?Q1fwKV&vA4o?X$V-iI2y-9@LmIh7YOg|Dxl5b57C^cnfVr6K0Ts{y6#xSKTfdrX zxgKz@@5-qrK($4hsZ-mkYA^=}@`<776TP`;>9K|~_fSd&4fSFSXlsfAdc4GovBbM* z9J_bpaR`yr4A7aFiMd=OE3HptvfaQAuRsVJ@dZ%G86}v*JT-=gKnZj3qgn8?qbjfP zYPs-x#FqQM^ZUQ_o4J__znA;JMhmapXn9GxY=4&RVLLi z3_8h87Mr|$sGP|A!Je}oCL9aKkisg=!m)O@NNBRv5D%~L2z8)Bk_Z#0Kv2E;5E5~U zOaHYra<~dqfU4~}s`d)6nhUz2E4rBM01r?B6cE2o{J%&nx)mV06wt}@%gGLKxvG1l z{0anzAW5dxin2V*b1BQE)eYd#4QL#!B1OCxyS8EG!F?E4yU@IJtYUQ)z0p~3jJb>o zX|mMd$2FEyXA={_Fb?g|4v>+}@sQ2!kU!qsjNjah64H^?;0tpAwOBl_^D4g<@Bo?I z0P@@bqI|@le8i$V&-zRO^32Z-zyJ-<$@{CioLZ_lKm~a1YLkn9;eyi8-SFbhi%0zVDUpsTd-i^&xL&-zT% zp-ayWpw#(H&+-fb48Q4ZffTEb!B!E7bUn$)&v1@r=o< ztpElf)l04b{LR#>?cV|(-~ip<^6cbT-T)8)x|s_CocaWBKnYy|ZN#+0UjY+pj^>AC z3cS0^8GhCr&fyfAv5LlSBTi-@i{i|@;-1jrFYYtJU=KC!oxT>bNB@}3VL6t5mJQZG z3_c75A@I)dyZ{TJga0PXM3*J#s9BkakoxF3d9&wGla7D~d<1>1q=he;Udp*5A z#!}pkYPnEjgg^=Xm8iz>LlYq|x$qM_0jWx{HI$$R?Ro+5{Q#Yv&!P+8qrBjV1)yLzy>ssmSm3)Fz&>JbqTQB7&>#?C## ze`s@012vG42?Yi1)jiTFPQ8BZW9-n3r;rOgQ)3~q8Gb-R;Qw1o!2?Gjqd;?@21GjP z@D1+`px>ID*-HNNmLA}re)OO&;7y+It8D;G4FOm#)&8vC^K9By-s%C}$*23YH?Ra$ zkVXybup*ZRgD?!#pnR{8;SaIl9B#aF-PUj&*B<`1QIZK*wsVIWy(TWQ&3q)|%nHjF z43CfofD3x26m}qlec30oKnw&XfWMYa^b24Bmae}-KiZuR>PUa@Ro?mgJk?oW%CLRl zqQBavKH&Xaxla56IIRSi0sZ;!FUm+Q(D+*cs($KM@AMS#$)tM&Q~(fvAYmd{(BMH&o=%;zC5>7z zTegBt43^6xE{qv9X56K*V?>R%Fh&HK(N?TXlw!S_r_bI?m@#3}dr8mc&3QR>#^c%3 zXHQnF>=}E+hKZ3YU)a>?Lnsj;LXaRGg7oN-RIFLGQc|P_iwg@69yoBYU_k@44IETp z+qMFQvJD_KP>_H?0=#zbCQwi}Zvq1f8c;|(n8I5Mi9J;C0K&uL#U3d1Wl*_qUBQY$ zSn%+H#gay;f{uPw+Vm@uxPlFn*6ktciMcA`%Kx>|_DGK)MdH#;a`(tso>aby=TheJ zn)YtuoJTKb&z(Pc+7e2%PEw|Wq89XoDWUi7;1iDTo-pMiJ2XOsC0q7vgR_U-j)j}H zuidSn&jsRajxiIOK9%&N-W&lkP`bJQ)fSJ(goEr?FfcO69AlF% z%N_(%u)zupp@~CSljcuA0}YfKYQPyW82{KPsx8G7eRH(M6-9zEl^JUU2ge+dTkg5& ze)K69Ozd%n$U5{O1W8YfX=g`Pc;?|r)^a{M0tgeXT;Q_zxU7K7_OR?vzy0px zFM+`VJnOMv8-t9kHy3-Wfd(J^Yd;7JWPyr?1oaj~LcKYMnp|L`ZBZ0|E6LGFNs6U6 zTqd27l~*p!^j=nTa_%Qte*)DWX)qx~4?hO-#FlvY;b$L(_i^~)hx3v6xN;&n;)Yzi z+_f*W)CzX3_8Kr?SYnL@voZ+E641a38hA{;HKm0sF~ZPdfU;}x3akOfLU)cZz+v;cEN8qRoNIvsWv-blwj5YYz_$Rbnc8D> zesE14{`e4FLcb-n8rP7vMQMykZ@M>ld3)DIsBNKiYFnzlS5vKfl(o~JzP5)Nfd?U* z6>rc^du_Jcep{w^BFO^dyUBv@G6l?9V685@qzk_>izQa@v>=#yakQp)OR_ZwR12*K zZ~kk50T37TByG-#3NU)+IR-2u2YS$xA z@uVH`Fa{y)Q4LQ(1rw|QhyU>W@xkF0&v+Aqi98f>0~eT}c>wZ@V9vrNv4m__X3CkF z6kw(SnCUK;v5d&la+Y4br7iMd3}WEIAobbBee7Ezvex1mDm20>Rk2DHt!R}?e5ikn zQc>%?c#_o(5R92XU@8{az?eKxCtdr|1S@EdYzT}Hn6O1U+L4ZNjKdq**kd*PSdE|w z${B+kq%nRW2NbH%0?s2-fW#6*EY(Ga*V4}(J>3N)QbzWC9TL?n!1#04Z$VNzwHu_kJ4&b~ZF%|XZmn|ipy6kd6SEx3{muG~UT zztGbyz*4BNe8Ll!Km{PAbDb@8Aq+z{PkNS2k~n1F`~EVxEYZbrjX?pkIP)eWUT=L> zWuHRx<^eQ)S(8Is8@IbW}iTXbCRG+E$fR7-3d>XndOFhAzXe4 zKvsOVb3b#TOMMu}mIOt{h=e)TYhk;ev$B8B~KR`-S(y+}z48jk6=!16B`(F4$g%E%ELl#^>f)HGQ zw0hx~$J`@5ztFI?qf9_m2b_SL;b}6bbpU7Zc9@y1Gl`>Qp8(40#KU-i1#h^-K?qWw zgqXq~%_}i|<6IZv;t$h3Saq$d9PGAAnv4Bzc=e#!QZ;2DSfKOB;ftv#XfkVQ(p{VnD)??p!cb;04&TG#$4`oKyy z97#Okq;#bd(gs|uCz6>>CvTegb{tNQhYc^%aDk ziJ_y(UFl@w5#C@2E40amvHi8z>+bchd;OVEP@uD$z3gP)S=q~`cFCz7 z(nr`r+xA%I?6elELq{-<)hPGCm~xeaC9G|2yVpFRfyn%_kYgds+X4bZRjW!_FFB;A zU0@4a{p^$8g@M4Aco@C=G+Y1(CL*+Ou!=xcTu|YvhQ>{yK#_wy+G=Mzj8J3plcyXK zl%NjF3H`vE#L83Hq((emF|e_Df`c9$-p)tJ@_C3N)B1IQ0s`}~qVuPo0^T>$pMLoZ z^Cf+D!jl4M+j(l)hXDmPa{(SsL^t_h7Jmx%Af*v(X#9y#-KfSeUU7D|=U(@wq5s#~ z`Rw+$+ky}!g+$$3j;{woXYZbn#ytM62R%GOA=Dte+6*7Dx9I~Mb4aSD7eD|5EC4RS z0^$N(+n>L@_MVt$I@GUavQ^XRhoQF*>CX%ynh~Y~PYA~AeVrjE$q+)ZJ;D1pXA8OA z1G%68x!+rfcOisekP7N34ts!`3UoQbY87z%iE;1*XK=oOiHcO&2N3$8wYffs$%lO? zheGJS2Qa$udnYIZu>4>;0V6AYV?XvewF1+(V$mnL@Cyc*3(6okGHbX5NSXZOnJpNN zpjZef45$7>6jKJtjV-mgyEIw9fhkd9(3q+%4dbthsiT`mp1!J%W z;p>A#poCzshY|!K5sDb(m9{2dR@s zv_ApxkF-b($N7RmU@!J^t2#&nP)vhIa0V*0LIg~}R@g!=+``gW#nUh*JqU&(D~)t0 zLvG8lZ;PNiazlH_g%B)0Kw&p02?k>@5fhmORZxRJd@{)K66oo-fYU)~Ou8y7Fa*;c zRnsR2(LBExfQEaY_rOFCFaq*20&^tC%K8Bvh=Fy)rC?x%Dm*|1WJOk7z-6fyyGsbKJ?w(t$oO zhH@zzdCWa0PXxtRdIX?+1))s9R&>J2oXn&o4OLu9R&dNpu?1>~%DXeHT+~IZ+y`Ue zN*$Q2h}wdNT#B`7$TxTcJt!6Elg--v136GjHX*;a%%qLULI0?W%e+9zF!>AbnY9O@ z76<{8Ny-ukU;vq%No0`^4|oDS*hEguPWbABI&j0FR7&1UMc%tidO6Bg%uLGM!bUKL zd1(mHyfM6cDHJo!LHGiQ`hvCUgG4y8A{&VQ+zLh5$o#SZ_L#wA$*PSJlar*O!BNB= zB$+JBq=BlL1{EB`89lAbA@PG2pOmje_|Pee$b`rRW1tSfBT9Wl%6zm;%EZSNy*)@E zhW3<(_q48p%sWK;kymI1(@ccxz|TQQgh@*Xa3azuq_j^^9vAokKx~}uR>1(~WJER4XM&b9!7OlT2{IMXG`CI4wCQ5l&>79~$OjZ=Fxg-eiz z_H+i&JVS!ayTmFi?%KkAa0VYeuOR&^aQP!Y$_7RC21aF6MJ+pJGyx`kfC{jH3K)yu z%+kGqOQfq(^r55zt14pI9=@0|0$4Z$*rA)*B)OQ2P?b(6qktG#g(rEEL869g&?OlG zPZq65^i)wfO;1m#Qv^~VJiWyxQwUTaWs3dWpm7+U5L%c#+=uKdhd5xK z3!qdd-IY|uCw+=C|5!Sv>%1CLzs##LNlHH(^bZDbwN(`}HGzOvwJ`skmO zn1(n&r}ePZ|8li}8p%&nxI(+pl3mX6ffSed$ z1%PD|Lc&#DJ<)rt$Ad-B6rGDdQ~w{wceRU|&1HsRbH5uQ<bnJJ1Uvz(Gfa7DZOgnkZ z6=ab$U0=I4STtQ_U7NztG)(6E^^*4<=H&&r?rUNk!FGmdOV4q8Zb1y9r`#-o-*UPx ze$^$Mm&ay4t^LgH`q7`(LRsJI%tfww?r){`k~hgY?Zg4GWt zxFG-gVuREPmFkNpq~bgUF_V2OwpY z&7UPapLD7E`~Fk)_%$~SB)4iU4KX+)mbc-V7P!#4iJz~Fe!D`Iq5(70^!DR`5%n`PY!z|1H9NW8r(o!sLeQhqX^H2Oo-q)jId|D(s`Q!XSMJt$853%yy`oe;Y=7x?LHDl;AW@3c7`)^Y!v&;Y7p$%*@o_jW{ zsKMlx6ePK_p#Zh6mpybKnPwGTz^D7y=U(Z@$G#~UfywV~*6&xX>q@-(P=g6Qmkt~F z2O`ISTZrNU+ZeI1FyDq`xqL@mEO+I*WJ25|P56ar!>h8CClEkS(VxQ-LS7*R<7{&r z9Mjb^1+>z0Q*d?IWNj}-2VJaz-$;jtZ-kUjom*UXV9@-Mv(i0}U>>VX7%jXU%-t>DkLPHjzwO@v5?*qnpLNO8(}T}*B| zp8w29Ip>`J`IrBD(JsvETzJc@gTPVA>L2H>hQZFoBtIH}7~+Gm-OxCiXLrw|^yxGc z3X|UjMT$Ii06V*NGkY#rird&(g?%Zn^4L}d_2xBoKhL}eYum2^FMWH%R5T zsDEJnk#En6GbG=i+j(7Z?0wt$7)TH+&4D{Zp; z-iz{h%XQoXJGAFtPlt<1SY#M_Q}WV$F7jNmh~9SyIw#;4F?Uw{a!cv~4^kw%(<(s< zvLngIK7~+ZglohW{rmwWXTkIs@W9xzE3v{p%&1ua;%>yn$FUG%tnL18r?MiO#@oG^ z=+KdAdbbX7GI`gyBVqri^GT>NKE{`oY!V}4uzmK~klBq@L_+kQ-|;Z3Jt&1FR_kqO zyoqt!1B}w2V@6(B;#bb$j>kh z1}Yyg^o()!=Ps{`j^A~FgyMUefz7Fi#>z^N&3u2X_wSa!$<22TS~KF(Z=LDm{o0RC zjn_+&KJux~Ias4xCPCUbR_v_u}Up5NA1`a0_i5y(o zOQ^tv_ah8GA`qq+-^c$GL}8#t6Sg$~optRFQG(SrBZPD&0e{8bX#dXJKaD@*j|k_W z660*=J$yHocrtA%k7Xj?q&eTs9TW4H2c#>U>cyxAwsQ;R+*|s_65l1Iz|gn@A(PGq zfbh_8Q&z1d3L+pIsCb=f%mgT(>O|4FYt}#kNtblSvOKI>NfjQ5_;$wnnrNzk8RLue zFc48H&)OM)&$ifIq5Z|0j9fp}N;dRa`>rzI?lV#-T$Sn6bi654^qXnA@T(iU3S!HjQ9wq!l=Duu`Xmb89;>Epp zzC?V~Zow!iAMe6t<`X)JNoh3iekk@t1H%kLJmY4IQk{W-t2vjsc_LG5-U`KKGcl*hh`8X8w>jz26{ z(n^`JQ0~Bg8*_i(xF7H`?$er_R0VTdWd5@Kr{)onJjBKbsT^;S!MrdRs~}g5r@BdD2i zgfb}73i7w^F9ti)B3>Yiof704Z+Uyh&XHR&g_&vtt1oKGKXZ=DpS}Y0Kdt}8^xkQy z8H7bTlS6Yjp)(tJQ>}O2O6IBd;|UTZ8MikkWS{7tZZ3Ev5Fnkdm~*!<9ITybY$_as z<7Dx>WGb;K!tMRETVLi^0PsH>9FbngH}W7>+&8N=KRYF)&8g-)T(+rwMuk+P=b<|0 zD=q%a;7Q&7!erOIUEr|DIgCABWq0qwp<_orR(~@x{P^4&C!0L=9wa1o^%Dz0uN@G% zF?5q!mpLhK4;7hO1;Tagerq&U`)mquppV^y`w@y$0C+jxcVZv}*43*yxhnm!$lEM7 zWcbZhvr#$8{Z6aV-c=v|j)79b+p#g-DtY<;Am6m`akM8$y~FMa_m1g*d!9?8z;i%w zVZABJw2-u?8vsG51?x=8GAKZ4pm0^X*8t=l=yxImgd~}AeX`4D6#LHaMuhcAUae%QMdxw2hSeDVF?*DA?=@4gH&-wW6-r#(n(J)QXarPWGa5{IX{*dpoI zTIKuwiAnjIG|c@+f?ADX=ivZ|M0VF74SFs_&hWy*?eWCS7eiyK|wAeW5t!EDVt+b$?yyBSFrKRuJ%vpcDr zsoK%upNP@^A|Yn`(fuX)gorG__5Bz6G^_l=~Cisv5BerWRP5I9gG3jy6%{Hnm~ z3C}av z4eP2hVg?TfnOWe2HBx)rR$aVm(>@<`Rd(%}$c_bAT5YZsp1JXCTrY?}V6PT^P7k8; zZasVBZ$JLA-iC(sI?}0ya{+_(gev!sG=}=gnct%b*zB}jYiZD{PV}@D(i7ryWI(m` zl=$ZKsIMqzD<)9Bp{y|(@r?E(ND~pT0V_#G$kKAAqF=Z(fEeNbEPq2b>!{&!M;bO! z;AXp-0s8%bm9xFko}aURA`@}RqW&5kFd+V$o7SP8PT>otNus^?(^D$}(gLDafm2bW zGIcr}3&&=-^ixh|%qFR0Kp0x(j5zlRNNsz=dIewga;izL@w)#vG1l`N8$_Pcl#@SJ zO(#XXwyHO5Zj3}@QNauSxUKRVarPmdMK9hPxiua?^_UBmaBS4H#f%D~eK5)s%v-<2 zuBuL(F@~k10c1QdsPuyi-<#1SJ-vQxD)BW5@`Fd6oBi11w_w2JNx420@_3=Kb(SKr z*-_KjsTCx#74#!NZFTE=Zm^_b%sbUC{I=rR0`%-+0}7) z5TQtXhwt%pfNcp2qOF%G1e(rpKOp;^9|d8;$wTQbnWo*M-Z>lJ)km~Gk92FhgHRME z@kH8Da|>`0Z_phDlLeKX3H$a|6k0W)B76v0hxxpMvgrmBd?wGXzI&hHE%=|{HDa$q z_FshF>9Rv+?(B_!e%Ra%r#vK)gN~sj!Br{yGK^2@5;_2o2#SPmp-0wxtERB;Yf1BR z-EzGv3k!t+fG0~bW;cVdcKbx^KS>B1n1Gb`ty5hHiE{DsT=d4&VH>~m+Mx8O*Y#@@O$+c~mJtga;)_k5MOh zo&hGzGI*3IcYYWvwnE=L^rU}{c%zvQ0Nl;}yzjmGJRplhbYn(m95LAr{fw5zN@~%E z-ihSs4XSwA<)n`sfA@W`XZ+K^#m8MTJDOD$3hM#mzt=*=^!C_L3Kw|Ujs^U2jxwR- z_bXR9RFS;^`Xx3FPdg+XOg?U9S(qgO2ra`gE`-XJ?zG&E|IEF*<4d|eEa>(X`K!5 zn9Gb;ywtnMh4J01hr9Qaetn=;Lk5gmr6#wswN!xteKYQ_rJ%E?!DI>uun4dKfWw#V zS5Lw%Fjiv>s2iOgh%r~`N;J^7G(?Xau_JWB4QR5Huv51^v#rPr3vHjR1nEeN{1`qBw>wNetww-mh}TC z^a1~57aCGX{~6ke(_X*u!>_)6`wu%}L8ioNGQdkbXcsP47N}`15(S;Zu$e*)4DkYX z?Nb-{!Ow}6-O5-+{pv8ph5{h~4oCPxh*u@@fsmzFd9Q`cu)qHjJXLr+vNxMtWU zhVJZ_QG8*<X5k;}c91Mm?K)29V@=T!?Dq*l($mS)MMI}&xd~9~)t^Ha^V-0UU zz&3GREJGf-*AV!16>2*B4{?xsuk#oy`9Nkk5D^8%iy{CgDf$^{M>(VDwNnlKr)oe$ z5R=&UAp;4t(xk)CwuHO=fPt#)M2v?kb)F;(BJI6Ow3$zO3dC_6=+1z^St)>XvTCe* z%;ixSl>ydk!uU}M5MyGWm%!lrc>DE9B{ziwel^Qj0g{-#9bk367=j2Cv%0FuJSnV62|==xv>KBt(Lf3% z&JH>~L_x$b3b*}v<3MSk_bM^{r`l4|BgPc;CJgYow{q$->&|p0zrD-=%j+c>#enc+ z4!`O=_aQSW$0<4GMl!WLS=boIr6g}W`KL-z1+pG(SexaWZ{2O`FJ|!QQA&_ZvC;Q_ z!{vTfpoF*&Gp|8Pk%_Vs0l4BI&1HaO({-^E805q?utkvyedPL9hhEcWg6*5Pd@nYn9 zMb*89YFeT+92hX4`p1y{M~MxJp#-F#oDL`6l4ndg0gzmZfQA3<;dwvM$2vY0CAhId zHnseuKW>!WS=S)uMz^{L;7w-#x$IY0ZiOFSPnF0ambw+Jtqajw&S+A3kz+SlA@Nab zEaQHq?vD>rZPdAmeLTx@PQp~(=Di-1M{b)+eH@$tPgGll0u6M~t2dviR%K=^>qqTU z+WKVbc*%$jwg@eZpf8XC5Jvz!uvIKPbR;2k^u8BCktwJLR_C^g!aZT60m_wjtO3#So^ zmIZ-r>%C*i&N#sh>P8baS@o&%-oE#5qFcqLYQ*%!Pz?;)8wigLo2LO_Hx9@t zxy|_T{z;A3hKF5al+ZWF{Wr}+O29p7D4AM-8vFZCDDHdEMgow80+Bq{+DX;U=|gfZ z*&~Df>cntzpYhS^XNuCi4K*2AUT2S5?07rwND)AC1hA@Z!Fqd=G=Ry=mO6kpubgRs zsZzcTtNj}y02L<|SOxqoJ8wRzZFBqtY_5uTr0brHIFz_vfh@J^_|UB!c;d|9zKdYe zxQD>Cg1=U4`R$yuUd*N+N+biIxZ`<%?;7B})eq*7N~ESrwV7(Tk3$blRGb&9uF%$q zg1kMhzn!Gk2V@%?lU3~`^b3^#HX=-kaD!I#=v$3Az*1^Jpn>A>Z-AKdIT@41S*Jr; z4UFY}Hjm$m?CE_9q#Qu2{A_u)bHbT@e9|$7TKdIOT*jV()jRKJamFvOtw63~>X8<} z{flau`ixh<+?JL{v9rT=q7vlLi>8i;pN0$~cQx-MeSHB|BVQog?pK-9{JSw>q?jaD z{5gO^6Fzg|u&>C6Ko{vQhTctCAykmSUNi3~8?#0Ek;xR?qM(`&#yml-l3GUTb;$Xz zAnt-u(%0(B+zC;J9|BQGKq&Kf|GTfHYF(~+6RGx6>*rEL@rO>Ocw<$Xw(LZ|5?#A2 zsN3BA#p(D+3)p~EGF6h+uiYR(|Idd0Bu!sP*D!EEmR5#{>@u$@*f5}&N2i)n#6M8P zk$V*KjeS4dR`aaHBEhB!pB!!XnT^^Y)86^5RDA9_Nt@$#fozHplA1?{H8j4~wV25% zzwdPnRu>GvDV)|L4E6vNwVAxnaSqj#`4FL;o~e)&(sX32%5!Ly}jPc^r?^R<% zNRkvSK(Q4RbInsdxrNKP6I*prB^jg=m?&?WCKOP_yX+ z)}l#_*d|C}E~BYIwi2|jCrgkmzdz*-TJ<38b<7MmLZ5sdFdtd(wJZ>IRr&9SN{9nH zMcI|V%JtQ_ik~q@?XbcpP|#Il-O*3xuRgxXI309kQYyUK7$xcA#B-(_n76;@m(0m8 z+-IBRk`t2JH>N5IlXyOGgCWa|y%~VmqxXL3>yaD=eHu@b*Wth2o8)eXsN$LbQZU`X zO|l0>(l)N9s!abSq?+SZc@LYU1yAFCqJqp+{XlXtDGFO4{NcobdokdFJ@dCZ^q9yl z`p=lp0|#0^-hh+%D=_a4Rs0XL@$}KA(?=T}eoIX-O}3utSW8YQ9l83DU^Z0&+c^oT z(70m4`R?prT6Vkjf}LhZFO>3$$7l}Wmfrnk8UfVUgVUK@dH~q)PfgW`2|3}zk zAWW0HhdpBZtFOv^h#yg#+sPFjXJZ{Tc%`TT`Z^-hakqY+48S+t_e)NhsQ!SLmvV&z zYNq)^?+!_ccAVNsk-sFR`XD^(M$24mMsrcD-)YsDez`tlWm-R)Cn@o62t}(sb2!FL z@&b7ScJBhgWH9gkPlKwSOAqp_=l&4N_2VC^03KB-zbTsj5Hv_;31g{jp2XTjavA`ab9O zc-8bZ(yS*1{rk=-kK<|j(Qp44?Ff!Asp5mrl&3&y2H7jeAFVzEsZAuVo!&QE(|@EK z2ofIEUagZ!kyR=zZI0cv=1HVHf6g9GXw5nyFEruuLL=nY*OPOD)zWd5P6Hkl4)CKs zI>)uBspr(wR+L^n`1|Vd!%^|WDzmRu=0W3CX>We|mgyz+&BSY7>K?jRnh@!P-|9Q~ zG#Eg7_dX{X6+iw}pQkSb;@!!cIMO&6M;Yw7%xxT*;xj`gq5`eS?pR6SWLWl?+a9RR9ohFDkSy{vPeqP$Ai@HeoWl> zP|#c}0#T%3+wAgv_gB~Zo7ZmpKzoE$1m&G?D@sU|et2f@yS+8tb*g0F%lVf3z38hy zqr40{w%_#}3em-@T%P&b2YkMck+bFgdC_y}j{32OmwtU3N;`K=+sc^c;X-FK!C)Mp zMJR2V=#!Z*cnZKYHZN2S*1PCjWD4h-u0PKWC*>3UvXQR(9_^GB5K>Z^M!SlYPRTnx zlP>$~!B5K)RnN_Pbph)vs&2)~?3ke9RGsx{Y|aa1=jf}(ha~<&b(~tgx7wn0u6TWX z+3G!1YWQlh+^sk4@8I7d{&NXeF8})P^_{$GV-NT;6KbH>a-dPS2Qp#uRTHf7gXspxoj8!bg-0goIn%2gEAe zHTOuB!1=J|jd*G0md(yfYl_YWnkm8!egCcI?IdP28|-#3AzN=RUihpUFk9Jli@fQ6 zM)L31k9o)9_kf|-f?CMSM4Vh5acI~;@nDEIw`or_a>am5P(^x?CZc)`-geI+za4;c zLNVJq5D_B1-ttQ%cL*x5%SFD40k`G8op1k=x!h&}k(Ww}FR_p*vgy3PK59Ap;0t2d}hDGD5L)ylMH$v|&n|}zco?Nd8YN)B)^vPt(@sl1IPG|}#MbM2g z{b#vMLlZa$O4<~Dnlg?1zSE6S-MCnLMbL)aAtd8OmrnPp+U6sVl3Hw8!OlN>|`O^HA; z$_IjLDqfn{0b`%oB4-gJS~P6~Ldr9gRM3%rp9{wl z%&nIXF{zrx%OCqG1LP$#>fp3|WxoJ`Ee`Uu7Z|WW->SZnr*Q!$Kt%id#F_X}sC>S7 z^QJBX(!CMSz2OKJdMB2J(&Rb1$H9-em>;UNJFck+#GVmi0|naUdE!k^M*7GWt7TZC z{f2JGN!K_Lqy@X^P<`z{VRY#ygVP{~eSPy5{<$7+UU#~8x8JGsMZ5mOvev6RdJAL5 zTfpK=v;j2C2iV5kH{o}=%XOwR9)W*2o+%mfCxA< zHNWy#*wEIsD#j-M<=7pUQ>2P79BdBR1@d`M)@6uas>d|1J6n(Ef>RQ+>e3Z(j3qN= z_z~4sp-z_(fzo!Ndlu$xZJ4tx5WasW&A{cWAW(RNBJ&0DT4Fc4_^#(?6c$FxXT(9` z7}o;96B?4{K%6V4--waOzl(r$Cd=_cW*&Y{u>~moeaTMvB{up;t^Q&i1yyYM`1fo6 z<|9J|RtcCB!EVp_Dbg(6fc?UB)9^!n3hqSk2qI&X+mBloO;rPkqHMb_B&AosH|VJw z{b`dV{22g~TLh%u`P0R!of>q5DkJYCNDG056^+j~Pg%4udF&b*myQMl$88|C$NJJi ziU1?1E8whR_|&%_t8JNH%4PSveG+BunV^i1M69cqj{)Y`uMe}bwS1QUVr~pyLkd@& z*S>MV)Lca_=lRi9KdAa#P?q92rS>c4mXi`gVmo;ddkkua4*`E~nxC6$y0Bk5smosKw9L zOYUR88oeQ*{bZRuYmHt)CgDK-z=DnsE9vG5ir7qJ*(SVY`rdDSfY17^y2rb<{(^Ib zUD{m(*!Cy?*nBY42kQ z1K@{yWp4}J-wGSh?)p3Phg_%_qo);TDpmt{UmJYEBEP-;g7NwH;c<7d32&g9Mx+hT z*^~KP8h>4vG_JjSBy!ue^zhVduEqRaqhdYtCY^^L4*y-#Fm6iILXm>09b6Eu{FSms zA>hi*IGJ0~-*3WL)+M-!PSb`czfqKt&4=}bho5q;hep=Z_4W9$|Lh{NB}OV$#RW(| z*X{LM1CAXRADn9Wq2BfyjtYLIqWx;qU`QbBxf(CwChNGq@pP#H?VX6e|IdV-l}{Hh zx)EA1iHN=8`B_J#R#J||%|p=V437VkcY;!HH+Opm|B$(-Po;wlxMZ*9SlLk8gQ0|P zDQXQ?u>GU#m}LD=ck7(Xt4JcTA@#dQ3@(%lPx}w4H!NqkwpRoQ@%7d@mr8CQTJPGMwtoZH9h9luZ)J073j=*> zd31iusf5=zlMX59@ipJTFVA@uI)0z!9JbGm;9AU@5~LT>;79Bag$kh$k#`mrpt_Mg zSW4`J@Mgfr=y$0&d1ND&fvQJ#ZT;M{7P!u00z-XRx1BBN6&nUBoA?>@CvXYFDz z-ij%FS1jY$&0Oj5EN6r+3P2B2i*HTe@?m7hGb+~KPsE(SYzI`tDQ6cxlhe)Z5A27M zYO!XYEaMXgLNRO695GN3&hZnb6D$@VvYx#IUqc|gTO~@{RjbLUz3ZuqTz+(IVc_u? zMl)|f0q!Re6ZQo+#73kt`rxwXTDL;sK5yNU`IOAQ<8JCI(trG0LmQgKDu-+C>kYmA zm(sqslRY{L|I=Pk9dxBeDW|~_Hp9h+`C%(ou-@&H37}`8?a!P!BK@_CS_QDK0et>Y zl8cR@%Y>x6s_Rw|;_17*H{9W=O+i!dTL)T+fIaDDrXaphP*Onp2=IVwidmw={OMqM z22VdNb8fM+B4 zOYkj8V|&1)tYCe+K%%BFTPA^VrPQ*SqS761Re|b&^lK^#7ASgRC60AjWP_4^+Zc?K zF8F(k8BwwFa1nzJ$mUmoA3(Tp8OLStjD7@7y(ekCoBgv|kJ>47*6@Z*zVMm> z{(NF8yHj4Oq+rJkEKx@iORmM$T{!xH&gaNd zm!S)kl0*w@1$QzbtL8uYpT7l7+V1iJ^DG`J9x$AWe##H=HQJF{N8b{;nmO#Qh)$!V z0a^Go=9{3vsODr?|FQjV&?q0CvVK8}3;1!8K{QaznTqWn!1dKpx2aOQoNvTk<&^fC z;3C|7t%L_t;43RYnk4kecVi1AHAON@VVb#j^VSiO>2wg9!4u{!D*qkVpAWGBK*;aT z`3cY$1Ef{6%-F-Wrh}fDLb|fhbBjefHiIMr05WP}bYT;0V(rtiYu?0ongCGj5z0j~ zt#iH}JH(lclU^+^lyF(zNhe*^QV`zUJ+c3OS@NCGXj6~mI#rUTbMnFJ$pw<_d!}uD zzJRf}@RB#}Cs^vyvRIwBc%Aprr)(5n*sGonlP4m=YR!X+h3-CwDpN?=voD;J`4l#_ z=ov(-?~Om6=)@@*oYIk&AB0KjI$wDv8@J*(*XBc8+v{&ZlR4Y=Pfm$qU6Pz!1X~n{ zX_9$SI3FfHT;+n6x3T!H%5JUXC!lybP;7!km;j1K<3uN@lEm&Ip$zv0Z^;Cbz`yGz z&9xrCyrmAX@KZnuq%h__+fzgbd7lw{+L3STyVqGEqzy41&IR;roEvTAQ!~k+XE^fK zNn_?-pbtq))4}Ra;>WCgf=c%GQ}g&J@3vD-V7k4&4o_M#XRMDM5+srY&2guQ3Ra0s z3Hd-_=U%K<8b*Hh)eiRLN1&K46)WT|7~>sK!4%P@3K)rquP&eYuR|h{Nyz-Mq(~L4 zW=j3@-ax)ET|N=qfeR5W34UDyALQchM%x#8^Q#hpt#FH{$LU^Lp2qfPU-Z%!oHe!9 z&Yn*K;3#2->0y^C@byEEjL(jbDBB6!vf)m?N1}NTc5f!mpMzoNl}P7T4hx80?49M{ zE^G+8p-nsac&bL3z5DK16E~>>4=<)L70P!8b_gl6zKVrSdY!x@@u&{GKJ_6(^ zmwL(|l0OhNTx1O~L0+)=4LTz#lM|_9{rqB!QR!uGOu`}WOu?6e$uET9R3#e{Zq{4G z*&FBl1EW|reG+!JweCu+HxpXU;GHLwlbC{dhKRRd|1$H5G`{<+Sf{td2JqNFU_RJ2 zA6Oy9`k^reJRshpDCGqmrMwi9XzCsF>lCnPKM*NHKJD^WoeMU$Z}8s>4c!YnCvw2cJmvF$)n4jb@PzA57r*<$Wa_^YzalqkR3<>iN{{F0+W zUQ~%hs?fe;H0~cmz?sV5{WSYQvgEs6LOf6`pD9|-$$48Y;>Q%3b%7bN(YWQoFrGvX zM`9Fc`X7kA1d;m6tf2}?yx|17&U%W(7A!|yEZ_!y{ceo) z|5dzFeh0u18xgK|$qad)nI_6?E9ZlggbQOU9H>GG-Z&wS2$}=#112wmRcEOin;gP$ zg~$RV;1=pi5uIM1QD($x8SVcfdT_C8t4YbaU;i+n%u_6C15&iEr zz~|~T?t}1bfHs$k!wR3jZKN2#khJ4>tA{Tg`1bI0@jNr2A+cs7`F4R;Ia&f_*A3Z9@lsDxuVQy3NFA z%wF;TrqA5YU_`nVt(Fa4`7Idw0DHjo{zsRrWDY;95G^MH;milG>IwO^Lb4nJN=y>z zA~a7)nF8=e0(h-z5tVFosR!RG9TCYugnAQ%avqFPZTDZ-9@Km2TzxIE1hjh?|8OXt z4{`u#_U0R1YWwWQ66HWKEbbBk*X_Wk%!Y-tC#{3)1l@}>HlCFfZ2ha2mL!6B4Es-s zf}M{*$sX`hV&NuqpooQ}{5S2s$iK_wj~V8N*DeRuEg#dhi1pwF0cD^chnZJ~gUP?#QyyxFyAyz5x*8segEbV^> z$7gwdjJfgD*!G$9Vv*$HlVx1XRkPc#vBA{M6e^w;DIVh|I~E)FJj$oVf!b!o5nN?qk9y4>;OOJM1uI!XkwjnuQ3S3eIbM6C zpjPV5UB((o&=GDMPeE^fQ_RRL|iqU}7o?f2c6|NQ*+P@i7$QNc`RoO*$RTFOit6 zS#NGpY!LegKI3?!K=#;Wu?kD{euMdye-rgTf=V^)PU!x{@2oiX#C+}l@=o|u%@Nm~ z-(xogS72F~!!1kUJJf=!@{UzYQyqR8)y7MsvERqlRb4LnJt-_X6(+>83aPKXl=bQL zgL4rdAH7;vL>4}bFEIV3vVLIKgJV$ef~`^?J9Sj8u`oOnBO-5{3}A{TuRW>IytG3j z0aKn`Q}ZZic$);HS{-hN83Ln1=EUVg?_PEv%qAW0?6#b5&XdX<%o6Mj#Lf)mR8Wro zEFTvfE0DL_bX|y$>~++N)v*)uWuR>y&yOYbri=Dnn((VQRA~-|VD#GGu+N)5ZMuG< zecn!HL@M}?Cf^ZmjLu1yt?d0XIM;8Z;Ad(KfHdmpcMtr_!(w4BB1fmo?MzR{|6Lmf zf>5-1fV$#v9mdsQZcLu(M>RQf^>s`=jF&=@PXm7RHet{s}yI3HP#3glX|O)Ep&bV>xXQQVRHpe81Bsq zmU)PIU3i+hJ1d+cBb|G900d^G1At0;TF9&_KnEhb2vV1dvOb?GgRG{q06`+Abn!5Y zh@C|q=~1EyQVFwvq@hrJ3SfFJV<5v7=akT}cN0o`-pHzw6_oP9ab&0sV}5YUn6AdAwQ@t5%h8! z%TpV3UBAt)d{FC8x7svnN=Q<^K@Pe5RCi;x?&VFp3F60AFoxJK76R8IDQOP^eY4p} zYT}v0ZmA$7(XpKY#gelYLoAwxfoHYh9Z+HSP*O5R>n_E3(emB!Ha2=5OTWwKbiKM{ zRH^LKea{5Q=g4n!Ri1hsd&UzrSq)#p*@csZl80OzQ^CWU%I@49ydAu!)Rq`BmX!yb@A(ymj))6wx4Yz>MP}jFQ1ycWJXE?8u7E(@Q^>> zMMU)3Yzu|SivsX=ZM?PW?C|Cu02u`P5E^nP>V*4(Z=S8$FURuBw|dXMJr9#sJK-u9 zF<4?fdM~E=Nx_59Kei7)RF%-;4@c$VN86KB|Ir!vazETMWmr09`7Y)l&+Ou2d`@3uA+065y!+Lg(f6mW66e?{giV?TNdSw0 zll$KNP0=vh;6Mgx5QzwHls<;K=#!))V8ei5UD%+|B-vXXsbG)L6G*o1qxK4Zl%Mwg zwS|_F#NMm5m(?-~OLCLsROFlH6Im7vB`97kJmDbw9Kwk57 zDoO{F#Fst=md4b=`%H~B{`)#W%%x}?S&`#8NrQN9+Cx1L%?LFHHh@)$Aooi+5l$Kq zJxU4n1`psl;TWyb4&-Vv@J>71=%<9V-nj-T)Ahal#@dYn@>rz!)aCUUh7OgKO+^+}t;4dDVXzKI_%^1vt z)*zSE!-&vBieUnyK`&O_ba;*N#{F}n&Q?Owt>22$ONd|g;r~_WT=6_QX8EXluJ=>F z$RkFo&NzwR%77|V=K|GS$L89yr~;)e=Poa^K}d^2D8<57LF_jZqq+uGWhI*PQnP7w zZJni2Fhec(yi3Ktw^;I;K;T79=?i@p%=y>=)<7AE0 zq06b~#nW4w4Dmo7`Kzyjoi#z?fVVe8`pim>^?*IL7;sYn7{3(*e{W#I@K0E+6o0=S z{Q&;2H_JH>AYmixjo_w-?YdHu@HdGb@+@qY)1NvCyS$_NEX^znQy<@4tqnhm@T5PZ zoWp6f1lhSWsBv{ghtP|(V+K0>7voI`U9NfL@-O)|j7$ta z&o^OTQGZgN$88E+kS5#bv>&lh9AVpY5RTJ5W1{v#z(ax^TLoj*Ts)x!0Bh$*Z8X@$ z=EM9>$-gY|6DkNb7{MBekY9X}>xG?l@0Gv*llK}izJ|v4fEd3;i~ok<-(;gxi&0|? zR2>HK{5bSs0W_EeFJ{Hd7bHIh;N)j7zj?2;#zMa%qFczY_ZKfJgdd2~2|gHj%MMC8 z((3E+7~EIf0VqJ^Cs=0??#s5fnzFysAO=f2;h7A??f_<2gWnDSRm(h9wIPQ9VCBP1 z%qS33&UhaQdo;|HaDnHr;9rss>%oqToF~Z6UkDVI2Y!<~?IeE%bM_k@)kWqV+)1q4 z;cdmB2Qj>B=l7Ftbd{M7W9utN}38ynFj%X5+p5t#xVVjJGo1oDRitO|W+r6D6u z(DCnSmc;Zf=X5~}ut=a?#Ewgj3p{NH_URkUN;gBOmTxf{FTq;XgcI@MS9c1v&F3+ek`wooaF2Bj-?mp_}so16_c7WD)U1W$gyuHUN(i7wW{$-AV_cxnQlS z{oGG`xp$g8&T&i5(VU#}A(mtanI)U1$Gr9uSoc!RWs2v&QDzzgeqlktCrU1jXq!Q_ z&12*{HXT#65U@z~W6c+|x@11iM_kL#e8EN6!_ndk1$v_eMWR_-biNdmLWS!UHlxw6 ze`eY>^Z#WijIvRq`Kb1GSTGyj06<=q=Q+>LuHNBm-YserC=RFc?)^Lj;euc07mI_c zTiziR!;z_UBcBUUNgBuz5Ao|oKl0)dc8O0q|cE&q4Yc# zK+WA@<^k+;+oTM1y#{iRu>GMXZXi@<8lJP0kuy~=6MpTApTOh%Licr4o@mrIh5s9w z1sX3nVEInvSHLR^Lq+&$FInHG1Tnt_1(DG66l5X=*|`c0!@#q5(3E?8J!E8VxJhL% zk3XHqlYZTk0^(^0$dY-Ak7`%1!|ONU4GjG-253Y{R}-)gJVk+8ZdTvHU7bDB&|`Je z`&X_P0IE+0OS6G{<RA>tgS>-DLFKWFbG9p~0J3w=MWZ>d<_Sw;S2K zRV+&;I|z@2(#Slr2fR6zI~P>$Gzde>aUGafZaQWV>2^nlNMOGS02;&S{t?R(iIdWY zoc##Rd39G=zhTZ5swrNgF5apo&U20k3kdJhyOcawfb~rwxD>Wdj$foz2^~~FYIT};n8!SFzEFu$wngYe+5!1 z-*fca!KQ+DB10ZRvw~u(?vU24`%ED+;eZKyGhQy>x#Qi+5wmMBuoj?mM3~15aBnuF z!4<<38-A7C4)$(`UHBgWoIqp0P(E^Cvz^QTK7Vk8A*d0{dWq`!dhQvt)A6N)DW>yK z4X!&3uq(T?Tf4R^wdES8;~GE_3B15diV|sq4LT34GZ)%m4bYGZrNF#Xfd!r5hDtC3 zDlj3{d%f11y$`#+L)5*z)B`8LTPT2z%(6w=iM};)_ zx&&vyxnuyqa^O{waHUU{tn}l039P^%0hp@m!14gW+3E|wK*7cUrx)zCa$2si=nmk3 ze5w$_AuPNkT*CF>4&tB<%3uw=pa=l92u*MVf#8NkMFcfWur&+_q)N%8I;onLx4pBs zykrBaMgmpvw;Zs3Colq}9D#(0mS|c3j}QoYyV15uKm{!8vQSXPn?wd#+_|1)WY?Eu z8X?A}TTeds37lAat9uBIpvDnA3%lUPln}eY5XW*nr@AYd8#%S*5RrQv!o)DbuLyVY z5XjG<4BCJUk+2A*fG|Ly24iq=BftfcYz7lj2_YIkOV>?mN2lEP@u9@&;(kn#cN~-GPlb}1`(lai3beK znfP;Q)xZ`Jiq^miq}a^Q9L>^9nK+ocA8D@f01m&P%`R;X4f=iI0MyG+49n09lVAv+ z&^cJ31P6BlYrqzcpbKshc=I>^e?bYH(Lg)3kUN|vG;ZkCH827kuw$wr0xxh&J#cWz zXowGZO%b@zh1k#|uwo-1h>JUjGBCMwKowe?(TfO|M-~Z5CS|3YY-EgyCU}AjY|O|E z!7c4a6b#K$E5|jhyXHEs>@W>GEfd`QnZSrA%Fqj-JqdeY2xz-*N}vRiCJ43Q7F12u za3MqX95YM#3?k~HkUFYN1OsAuEjvI2UQJZVxMJx0)^PoKaxK>#KwL18M#0(!RKd9! z-O(zW2YZlu^24kc@uezVy1>k(W{iR8ovB+-Zs2a?M4|O#)OP2Xc_nWIz>E5VO?Xf$P!; z2CNZZx)PyV(j|zx3kjx3Hs0`M-o)?;hhPh=0L|;YcJDpe?w~1p8lad>-+WA7#83__ z*(vZqnsQZ&oZtp-@ZWQA1UszTvVXb6U|zb0$4RRsl*-m8U};vFyoEdT>3U;#Q1-A|AeG@b`48?yyp zrKXNIJ^r&ir|MdQ*bABDVEUyG9P1J}>#L9pw|?vIox$Qdnbi!Z(+~_;p5^Do4*OOQ z@+w!nPzswc3;R0oo zupsqw&fnX3^?RW8TVJaNU+`YvxNW-web@p!5CRnd@D-i~T^*l2yB1R9$7jl5 z?WqE0$r37g+TWKlFXQ~BSeKJ zRIFyXinNWKJ6*dXLiFbkAwrPMo<*Bh?OL;x+*0xsS8gi0p7cPXbf^&}cJtV+nlSe87y?4rH@j_i{(V|jzuwWUe zMh&V!Ln2Igm|I0e8@+q{?m>|v7vfyj2y!&4*791yge}*_$xWC!EQ^K-V@Rg5V%%^4 z!s29Tr^}*4ivl$|bg9ywMVmrNk|czMCswVptdi$X*E9XUhHZo_wgw~+t+(Wg>l3=@ zDhrZ7_UenBSOOcYu*2ACY%vTQvrMvi+<^?l%fKOKv(8Q=#+PzND-9M@PE!pL)v##d zh%96aq#zkY;6XPPY5?vx;fN@rNF$LjvWVh{TZ0iN1Mwn>EWF4fk|e5_0~J`d>*%JN zTnTSHpT;E0sP)uSYRo#)#Y8asd5k!Ci1`%o?f{To?$EltG1) z7g5;+)sYbMB7-bs%{cSSWO(2yM;(@3ZdH^(_E2OI zENVUiHYi{qAqi0?nS>Na%m})RE`sJ=Xrq%p(#WZKXx8ZysGXXK;Ckq-`5InO;e-=L zc-Glxp@qupB%mNysWp4rqm3+*aKS3KbwIy~JIH7PUw!46qY(KiDa2sC2Sv-^zu#I| z@WE3lT*4p)4tGopFck}iEx>UZjAhDW9D59>I2EdDY_3!%G6y`&VUBPRgAwVYC`++bq6{80VeXho8JybpoATW zVG62?;U3fo0k|Qy9nihN7HtegMF%IJQwvgLWDUhp+OR0{8ymc!SXBTnCL7ghBTxYg<7;C z5CIu1p_m`&Vt>NO5@rg;nf{9A;m)GJX`baR)|3l2J<+JcQNkMPkjG$1HH$+;Vw~rk zTvRFOi_MVgM9`22JmqNzJCtG*k=RK-z2Js8Kw$>Gl)(m^FbZL~LuK!H2RcSmkArSw z8{g<8a~QfUL9F2-L{NefB;vy#YV?#ra-K(@7rm1$i}&9u;L74FkKOh0T9AK2VCVkSGs1mpduN`M{3a#QZ$rX zV-Uj*T42%|^hP+rQ66GDs@Pff@TAsznq(ylMQOqA1DlP32R!iKIeGT8K{-lK{ve0b zrdBP|{2N-{NEcSHA{DZQSTw8Qm)tUyw|WF_h=H52a*Bv!iXq3Sta>74)I%QO*q|&H zLATW`S0DmWLs?}IOeKJF6wx>+cSnPcf_@jgAtA{!mZ6L9zydt`bVDGV3=1b!8NF4r zT3~x6%U(Ieq}R)@ex)}8DP}%2bUxOqi@lG#b(FLKB*B#Z5XgY+{$!5mok9 z)dJfy^|nA-&*A_sbs0s2WB~;icmNAK+`y2`7X`1!!IvR2Lo8hlXaIGoPiP|?6ayc%us9%^Bg0!4 z-tZscj!l3ea+RAL<&W>RD`=sLmb?7dlZZs-3&E463`K0>a)TSz#FH$LV5Khb!Ou}3 zgen}pz*f;y?Da)A03AXveAe3IO?N>T?mI5oQau01%Ar0IdCp0kb;|I zAvd50f53-IFh4VRs9`CNj35Q&7%wG5yu`B!`h&v9t3Uc9Ia;th{{t&D+B|egF!mt8 zeVPFbKtQ3h02DBv8@PcmQbRSAK>v_~KY^GFgu1j~x3w@7Yx;yh^SwvOsl5Sbm9vsX;oY@)}*n@rW2Yx^Y^V6Lu zkf7d;`PIoK_?usx{59}L_dJj_FEVueGPqrISnUjVLZ2*kjspHK(| zY2deh%ajolu6QU1X_&rQ_yk_iAY?!WUhoB7D~Rn8mrR6$O*8~g{KRb##iA(^BuSo% z-~x-NGDgsnSj;~t)HNp~IajDWThxi2;JjTllhKo(J@5kc3dRkH01K!95O@M*T*l36 z#`c*TJNN_9dJ7BxT(=DLsn<#nK@*GM+lyczzG_GX&ZwU}Qb%@lN6EREc5EQBW5mGt zgk69KWMBr=Kn-MolK4;qHvt<>#3DB!NFe+MP#Q(vIT~dVlBqdGhjbEb*@*IjOZsb- zmbpCf7`-$RK%^KwF&Ihp8UYUAfDI5j572>aV*wUOpO= z6E!Ibc4?8LZ#ro zfP^9_`pdxoL;()~0rWXc#B|A*JOeohEu@G{x9CHhY%QJC!$sLlaGZtD1PoPhg}lf& zXIRIwi?rbit^%qCW56`nlucfs&DD?u6QThixEZk7K`e3s8MuZ|{6u~b&SwAw^s}KH z8W#9^uUDcd`6{BsQmkH4(O%J-tbw8y)tc@cffMM?77zizOaTz^02IIh7Wg^DOv7em z3H20;E^N<6KrL+Ssmlzi`CO3tbc;)22hgODNC>-CFou3ZO$}k7$w^8LiAT-&gkO*c zYskk1ts6DK0wA~n8aRUZP@y3J0vf0!Sl|bKz|cDtPQa_78!{TID#Wq&;z0ZM_HxSSx|*v z_=K>tgMUggzL`O>HgF>sg$Ul3MpPzGXv1y$ID=UP){eNbqn)3jNJdZ5;rz1D;O ziiTPkg}x$=-%*;43fDqCQ6oAcMa_*d6RCEk9{rlpcNKvYm;o=Kf_dFh)bjy+eZ2!~ z1Ac9T1;evETQ{ES8$wwaZR9|Qc~#C_g>s-(!03ff$OFKj1&mG2E;UU=3^9>040jM& zo9G2(*aS>eQy_2w5@6XZY8Mw^gm0(^e27^+z1HrMAt3~W8iJ^$8PWI(S6G^_=Mmb6 zAli0aC8V9v7rjIufLaugS{cCCe5Hb<6ID52y8l3gB(=cXv%os^vz!E~v0W5bh1Etw z+j3x>i2Z~=0E|ny*wr*U#t^Y`mS)>iWRRb(affS(A9SbHD5QJL)z_@D# z-|%f*gu<(uwH=)0f~C1!5tL5-cS!BA}%&=<$*Gb=2#D zfv*WYHIWYw$Y1gF(Zh6`d+n?|=?}Si#y&~6fw{dpEEKp9TWoURhUJC`UYy1eg*?y% z3yvI(-6Q2)$Hv&$F2xYw6@_qshF+KjP7sAnIGs3<4Jm*EDsqC?2__T&K;$H-1-`0< zYlthkn&DVODDT=hBzuM>D>faz7Qgx{BFJ1K)(u8&tVfL^`qihhp^iO}fvKo~3J@?5 zfaMTCOdPm@w^@QU#22}lz&E5!zF93k^I`)*lxt$(F*cM{um<2-oQTzgJP3tZ2!%F2 z#N^%5X$CF{zGGueoq2MuELa^ZKm#?9f+L{QLk8Hd&NQC*gz~`IgYLqV0^2E2)BmmJM?G!lrPKIYT3CgMU4=X_3{Q||x!quwzF2Jk4hLgh4X&~SZ!WbO zQ6Ur(f=Y@2H~5BCdnn@I2w^BF?W*Br4voAwcuU zgFQ$B)AN9chT4ff%*4dyTlv3v2A!kFF+S)?HU!w}zdD2o45ZP3e_x={W|_ z;d*0?#pZiVjYU9&J9xM?M4>q)fe^R=PCy61i`*qq#aaM~keIbutF`!h>W_=+i=;(W z@IONc$-Ml+_RuFc*s%z}U#J~0ibhPu#Fws+12uq5e{mEwGBgA>5O>SW1$l$rGFxc? zuEA)WSNQ~5U}-MZkkni!I^I%9BL@jy1$o#Ye5^`dD22oSCN&jm0u&0|Zu=>p9=VI81uOiuP$2EmGHqQn4}F4y6liQGE`cY0<)N!+ z^gIJ9kb^gP%&x|5Y0?|p%RM`cPr)f>;eLx%AZ|Mfg@~PnIY{p1&fw^FZj8AYNDHy) zCWqd7u?>Rp4XVmgK!Z}7)4)Y!69|D`z=!hg(6WpIE+7))P{sE9hMc5cttqZpJ5AaL+1IebPevVYgsbmpCQc=cF+;*?DIEx3=@GcbqG z+CKmb0!EAX+#fK`Ob*O=aLfe304`$icn_NeOmOz&E%87XbZTeuaUchk2d7>r22|Jy zqj)ZF-su}~0TU1cQpowlo!LqUa-Rp$5S^%nT+1iydC} z?8)P!LInz@O&b)5P=}5itY72*Xd=4_nc5UDVnlRkBgvS(e?yv?X{D!6#ZzU{v$2s$ zO1*C8+}ZQzDxpe`UN?%J-FBQ!y*G6_F6z`@ZSo+4h76h4MT_i+JtF@|lKQUDRjP&V zExx#M(aq%u7hL3p#9jvWwbx%n3>Fw-4kA_9F+3Qp5V=hGq8Nz>g@ zPcjvrlueB%l{n^Qp$IRsl;WO6Vu6{38goDag);a#B8*%8`G=01(bNJ+7kL$-SAq)y zCYWIn@;PCJ7GC&Rh8k}FD1xDtL9xeAp|Mb+29K6#5C}267Q>3K$!Obc7u^_Bjvnp! zTaP{#mz+n9(9{SqvmE)!D$^}Vi7`;p>LfYrOgSYuQGF6s8&t^gNtbARDOMI)%rOZn zs08B0HQN9Zt(yM*_s%!hMk5Rh$o)n zk{cm~HT)T=DQ$j06&h z7+$#X&dq?B0f^4;@chj+r$-}B&)-DzOfB0AQgoh3CtWVnO*^fEx`bY~S-UMj;l@uP zLeYW@AP~fLY93I~Km%ZV@WG2Luy8|+z`oH&8)<_S(?=tLx})3+GyDl9cgvJXBYK0w zjy0NGOi3QAcoNLuOeuA%;o*&kcqru%BM)I{TqIDjiAX4da+%Yd8{(h_D5&8b=om$` z%n&+ZxT$CVr`zB+&|$3&w(c3O(*-HE#Rx`>VGLqep%|3l!o~0ahPl(7?$&h~L*Wnx zGZ;dd+^~nM6~Yj4n865q0D=-E&mfWl0rHaf0fe|fAxlVE7__&&IjD_bZ3ExIf-@Yt znGb!@ylJj{)CMK~)8Qljzp2%+%p~!_B;aE8S(b0}~%wrYzpbBO50u`c|!~z4c z2L}>M4dTE@G(gA5E<_;;W~c=uS4YW8UNWJ|SSTks3Cf3l(iN^)*0MNZ(R%KIkTlD~ zM(5zsk9sr@A{|~Kn$=1aB(ZBApq?;Wqyv9FVTxH$<}#Q0OlfveB$@c)PJPsfKR`^I zl;9>e*ujletb!+zm>(-_;l`reiYQS<%Kk!DM{*>N8^zc|7>?CAQT$O96kXOPB(X9{ zXagVU09_Z_8qg?kK@hbNh6WLu&`T~<84U#nL|qY4iB6QF7UhH{3abf22of}*5h-K; zYspx~-cpFVY=H=x=mC`u1O=?2o=Y($n==6GY-d|$7CF+roHoarEBVAvv)LS?vI87Q zRqFg!VT+^?4yxXf-%RLhwQqn-GOqm1|b_sG%2faRfl$iWe@d z!4bN+>oT5^$xP-|uX}x{UjZ9fSEyoHs<3EbBZ1gOE%vc_2&qUNn}^{^wv{Qcz%NOY zJk8>uvtyf0ZO(9q8gcKmzFAwSOrlzAHi8gAZO&1v5!+R0La9r#Z5y*ARj7ssSL5mJ zZ$F`oX%LqRRcON;3b6@Zbjdw3Mgxt}z={6|LlD-*%U%W~2uIYS7T^um=Ii>k5}Ye`>Q?tx5P z?lQeJfLULLfCUSA!V}2$FESYT4v1K$r`Cp3;G85larRLrSPRrTQ$n`Wh^;C_@v1(% zD$pIAty}O&snF#{ce;_(?l!cu z5Td9?J@jD?NY_{maEL=3+yD!4xXE+Rh~2>bf~ORYVU!RZD=a2Haf-v*;vteRi|4>O zH_Q?WJD33sDC5c<%%KXGEm6r!&P0NsTn7v>CKb-$cw{FVZ7^^1NEAFxInVjpifB$b zW-*k`yUG05{58?8Q`!ou8cz=o{*vv zd7$uzAIJwTr4SzoVGGAh85Is3us;l}v<&`U7lk8dYXi>anMCJF!?^+7Du~|DiIdUg zkJ6c&Q=D5la055Eo+cE7GW1y(=l zpH#?%Oo$7)Q1jU!3uzSId4b-29}M8o4@ym!&4D2tf)1RYX$XV`TmT55z~QyurRabZ zG2Q^Z!5h@nTO#8~HHIPXW%(&B8I11Lz^3&_#m(Eu6x~IAFQ09yz4j1eU`z zgu(^(8KXtQH1I?2c_2URgF9HmLTM7Spu#OIgX*}$JGcY3#EG{kNP`@P(%jCuP~v0o zfF-69EWOhAaU%HPkY)g3`1ze@T#X-ifUi-&*Bk^0TmTB70QF1?6h>i8$sZMkLH5+t zO~qU^F&MOsN;Rp(a0~|_02N4Z-YgJ986Kc3Xu=#s!Yp{gIDi;cJz&U`gHxoNGSs2$ zd6Xfz0`B$U2iC(pD8nZ)OCT^pE!;vhBqHg2gSE8IEyT|3Kw@H02qof<3gjbX*w76b zie`Y~53|L5ZZI1FRwwz9RLAO^Y-^Oi{uAyIGM<#a#EWO=-mqkqC!s6$cpZ zhDkI+=lwz%ir%YeLLN{8G`7z)>dymSW3F7IZ)wB(Twox0)E;PpMEyc9_~cK<6FnJ% zB*cO6jRHY^gF7su>70&tk%AzM!GgRXV&LOGKE}DEOQC$?KV}9HatI6n9uO5mqo4@b zFp(?1ViXD3Y{(QY=AtgPnX|oFYW<%vh9tz0Bs-MDFUZ?0tipW-MN3WDbU-M+ra)504g?QL<-uirO=*}VTE1fcnYom|IG!B5fgb#U9&CXhz@^%_&CKb@ zPTd@Fd;&274s$>ZI|M^8=p|piiYfpmB^1?%g;-%u$u*WCIA}v+Y6385!z6e?79;^= zGFlK-W@X0OWugHxhyx%9!WtZ9cik0tkpc=4!97;x4Cy0lItJ8C4Q7PmKjP31L4hri zlp%nD1ysNTgxQ!;4+^*dL*PJw`3sHQ0dc;;5C943C z-*6{Tc*1v5qq)W8xrt19N+1O)W-qK~;8lSa*peYk!jf8_^+m$tAdng)!&(td3c&)Y z<&}Rv!+Cm_F5JRXrjTM>B7z!dx)93$4+3OnaDbt3fDSWK?D;^ zb*K<50n4>qZ5$Zdu)z}$LZO00au$rJD2)G=&oW^X=l#OO)aa}HB~YA#h2csY@@S8i zA=81w1P*DD!sicd0+X8RlR~K|ltVoL92Z1o3ZVil07G6W)I#Y3!?j)Juuu(LV(wri zKlbB-rl|wKUM(C%nIq=tDhoM5$cAhx@jxr> z5{HE1n(9yzyea3%7sn||u0eqd@D~WwY!f0+;!P``&R-VHpPHQk6Kuh@ny9xDg4?L* zqB^IXfy#|Q3?;CGF|;diWf*rJf+~2zyozV)Ou_T1Xb4wBw=h6_A^2k@pV zveZN3Kuj?nZAFs!w@@(|QCu#BMmuZq*(_9;iYnID;I~ zYgPH~?;<7z7OyK5@9|oVC|E=DGH)U^EIh7Y#45U=bg9J%$Eohpi znH|OU?e^BN4Lce2Evc-DNXGrJ#yPG?5%Df{#vFvf2LO|>`G5;(@`wIrL@vP@@NX58 z?iNfj6&wQTTCsAz*#RqzM+PHE)L8?Qkr>nNtJtn9u)-Pl)`+DZ2XAl$o*SrggByqN z5Te36m~c4OgU|qin!v@}>e!C8Fm^f8E!+YPM-+KQTn<;Clg?TXH!=|48qE+fXK)5> zauo;|1etlLLYNuZfL7;@@)NKI7@V>I-;|27GF@&lENhc2uYxs{L*ICtPvikDtO9oO zt}pWszV@#F1SX~`ym7AW0VniAF<|sGV01AY>@iHkH$)2{jKY5Khgu1P83YtSZJMXK z>KMc-$AVI;!JQ@$RwBb!9C!U}*fT1d?iR)koVD`OQd`hdy-tE8*Sq3Yq z!4FZv){L3rX)ao<98=$cJhK5CfB`8>^*y7g78&q9lh5i_6IXk617kxd2sDz2f|Hqb zE@*21FB=ZuVqQDon$IW7xZ%4^I@`LXYSF zgrnO80=Fs%xBAMphkH0MEQ27ll^NuW2a%4Oyb1O8HG)*PgfI<1w!kX=xg~;J3v^=2 zuBixcKx~F$WuP-+?SUEyK|`_>Yvk`15cj)*HW+}x7clu1JOLB@fZ|2DMxrh&V_r(U z1arKNM{xO;Gx)nk!XKytErfYh@$#4hb4(&8*qV88qk;~~^-dyLdHEGA6oa;`L9)kH zEnLIuNYFM+uS)y%R9fW>ohh1fK(=dpqBE$D8_Et)&Xj2%6}Z5pw+IeQ5oA^oXot3@ zGx?|cfa0-%X_I>YjqAdAq3UjRHW_%UFSwq;`X8(Ut(O}(^v@g}W~VAVL<{r(1p4}; ze}NgE zQ;ZllD7-oeZ(=sQD}XpE94{Vn0y#7fIaf=!6Xy|J|y%1TLjrNr2QD& zZSze+;0CT=&8jAiX2eR!ua>ET3hUl$J3xMW%W~ZC#K8_E0rJiP74Ye`0_Pn#_2Osx z7F@yO&pRr|CDAXcob{C5T>hz`8!|S1BxIN-{J|##gC|r&LtB0Ro4#)uyd5PbK!5{R zj+?e}+O%;~xX_g*ZK(EmaWl!)JAeEzX3SWx)+lY!mI)GLgJg{wO2h=3#EB&;SiO3| zlF2BL7$-b7QeVG+0YjqyB$yJVOq4t&R=hZq zr%#mrP-=8Ya-&A&%FQxX4&1LunpA1}6Db&_Y2;9k8%ItxYt;h5t>!G7Am-W!7v_fL z5aOIYla$rlH+*(KxMifq5GiRgB_mWVQDxVTiV-6*HgDqO(Sm#npg?~D z9ZFP$(xn_Ww4X5qiWja_@mDQ`b;pi5Zlv;RiLjO!>kK*4YD+=3-rC{`ADFNUFGBVT z%)-A0E3B|g8e7am#~_o8GRrP2hn8P3^9(f6NDGA<)=-O4M%BiNt;QNr6Ua7&2udh7 zZFVRaz3NP$b!@@pH>=VU4`J|D^CL^)L6H_cTv^gjVCX~})jBz#AViTw} zaxepjn}J~aHMfPd*=-qE_6Q@3KBL+r&1Vg9h#x5d5yqWwqQNpcBDn3A3sP#4={hu@ zUDMoi4GBcub=hP(OT34-r+x%oP;N@l2He&?5UK6lr9%^|cyx9H<;}6!KL^ zg?t>Ao85|ysER5iayF7PiFO4aexeb?j8UTbMx1M~Z(~$kn z-2-fB$u8SmsQ}$q?X~;OV@)smBM%C5=SX6RMwd8HEl3;IqwlsJ2IGk*Cf<~>$OLi{C-;k441^ew z_=GA}Q5DX4&NVc$QEbRDx@*{sAg4>6&U!HkYaq)D9gH1lWMmH2+yEmI$10NB48aLyxPy>|EFnHBfx<56j)hmc1sARsJgaeQ3}aw~Okg1AjSa8ag0caVij)8!!KA7$I!iOjsiKIH}RN9h44`s9F)i> zf3XjZ;A0<$e1;;|upHk(Z5g#-1h<06tseA%Bwn&)cdWw_O`vILWiluat%9FY@(W)5 znE{?eFoNxQK~4YKfu78guvsc7L3_L9Ez_dQCorLxngRp;AQ4Q&g^@#xJ7yV`c?f2{ zh#0HjMmdUMK+sS{Wxv4HjmE*5J9@KbMGfZ#F;~taIg1nI&;K-q9tz+R7soK=76ty%>V`vRi#9C;05QcsfpW@ z!(SJ+uv@;N4qy;zNg=iuPJNN3o+u{cUYZIs%Cs<+ncOi}VU2Q3L#NinrcdYi8g9TW zSmHD-HAUA}p$EYOD_E!V0+UdOtYuZ#v-X2F zec=mURoKBp@zjAkNmnQ{(Cc2IP@ewaYkh$gZ2KM*zw^~^u`AsWF&|6DQl$c>nUJZf zUW8fAa#j>Oy(TMyfh%3bX0$f*Z*Gn%&ZPFDt!^+xMO@2H*g`dtij2YDNHHxUJ_|m8kq$LeeFw&P~<|6qVsP!1AIYiSc4lmRR)12 z5(s6ygE+{k2Rq+^kE7uu8dU8<6dtUL73TICwWzR#`AL!u?|H*MsS`xslN6)0N4j?! z0r#9os2QxX1x~qf7;?-ozX8s$OMst`$6MZvWr(F6D&{fOdn)%Txe@baMKzvmz))C| z7Ob#^9PcPBVSzKtI@_`}ybNZbMe8$3T2hmq@s2a&;~lfDDx9OByE*$#8_&>%BgSxH zJ@?rs)m9Io1HBagrAW8XBG3~QV29oH1nem`1_PvX?6*lzT2f%JbdMpCX~hazap@J+ zk&&zyRn2!5)7We$4=9yctYQ@n9BOG7Qfn=DITByq!_SxnNNCaS8p6g0M`+sxs|rFG z(OBU#n*EGtjA9K+utAIVeOiO18KCat?^Vh~Qomb{9RAfZ@x=_)53Bf!?q; zM6Ab$khi8aCPojH>fT2dwZ0)&jm>^y8mTs*Dh@G+ffqbinfA94jpt zcV63IZXEyrJm`NL`rt4PWW}l!Fq|gx(((P$$*PJHQlAFZ!C?)6tD+EXAb2bEd*!gt ze(YrjhR>=1NKgU?9lD4xI?xdfKxmx!QRo67nwIyyKVuoo&;=>HqXd(@K=9VKlTl>8 zlntbyDM0grpcwB3$FIk_Q5pJ;XBovQt{-CQ)8!SIQ1mZoe%|Iq%wZlIdiEak5RoBu zBc!exsIDBW;S;W|^;W?aPJy&yZT7^8%f_w{rh)8S=bSbnNyY>fqM;t5!4Y6V7oK4o z=57s$Pvah}TJo;hnr|7Dp#^V&6a*pqOd=<$?ZV@DqqZ3=OCZ=O7elK@AVC4RhnxAaKj% zuow!V7?i;fItX?mp%?0bAI_{E_E7Gm#FAiP8H7O?00GXB;2e=43b+8m5U~Y;!FXc- zqDi)6JGx_C;3Q7^7<$2YWI`TQVN8}}9=C%NCLs{m zBvE*d=N3wBq@u*?3KS1b44@zh?jsM}Vx!tZ=zxwvtmr|u02a644N!{n0^$6 zBVP&@Q$D z_#A-<#_9vVv0Em|OQu8@7!ej+0TrTBppaxtl7trIku|N-5Zdak@@1hCrGuWUt_+PR zV1Rp^pwZ%BDi|ac*HYcypz>%5F5nUtzu*n(PncRNBOOD%Lhla<;V(Z@AqG<+R$&+; zK`}X}F&*p-8cmxB_472Ds2C44SAy@uVrj z;9tmNL*1rN+CWkkBt%102_xnTBr-ZTPeoUh$Qpw~MkTWF%@bmj^d=J=YIMtR)G*tC z5`KXa!VuvgGctwL8m1u{r_pu#L?F|I5dgsvgke74K^&sNo`_%utAi%OL%67q`aq1V z)a6W`C6p$?Fg@vONNHcTlDWz=C0Y!(XPGen^c3gH-8Cd<|}?Amob zuTdEyfm4HK?ToDwpfpNX$c3bX`t;KtoghP3?gX}{KS)d>l!$Hsg}Gd(#8NCNX3nl) zAPElAU*KkY;srortWPwSVU}|_IaUwq;0vArWJPv5E#y-`#j!|bP_yt8GC^ey#QZ)>A*s4X%E-vr5N)VDZ zRtJEn0HodmZkfPD=dw>V#xOo_TeHv;AOjM(vk?S$;HtqIe8F%LmlitbJar};E_ETy zcSzMUCOK9E?Nw z6v^@Um_D63lc(^5|r3C-qkqjVH;+v0Cqr$zqT}vGv||vu|*dksay6FlN!-GhBJ)q zWQ=RsJ#rV9wT;GrW)s&qKjt7Sgu+nHMGXqYj+3)(fi9%pr$i})gz5G!@zThc&P7eu z|NItmjv+9A;S(HLry|)Ce&MLBp(QW*oSiX~i#QTo|DlufAPfwQ6Wl?R-ND$1&kTq* zmC+&ZP_B>!z7;B->T7&zXMdw*@t!ohKo#+`u7d|Arh)l^m7Y_?TMmq*NHPgj;Mt3C2L6 zD+)lawqEANh+v?ua<{dc!YS^>OsnVYhM=xw?9k#^Am3(tf~c+Cdg!j`kLQ}MM;cHK zISVu4W8TZJ1)J)u;TU3C6XxI#RN=6Fbjx;nh#9-FAA1@!0Tq^E5;&D+(_|7*K^S~; zv!lSa;!f_qA@4#$3{1`jOhP}!;9QieS0SznvOsnLJPER3S++9rAoQvo_KhRfZFn0) zw+B$z7Pv(eFGeaNKRTqNx$}_wMP2lzD1o_Uin1tyrK9^3q#?SeySfeA79vx-b-G<& z9G#uSw}U+W-Tl#ZZo5K_qABd-Hk+C zmN*!f%ttO}eJ>J$7LOZS^Ojrpx)I*sg-I{iKj9aS*w__T*;xSsb-H_--NlEvd)e2g zf4assK^Zt9u1ej&C}I>yVH>ug&IBPH%`x2nx!lEts>L8fS*$``*Is5D-sNgSS8TdE zpaW>EU-G?Jn@H1P2QB^m>CeY~;sT4BHxVveF9@LuFY>(bmW(*ORQ%`ReI0TN;}?hl zQzstnJ82Rweipo0u{S>M^Bl(IP^W)-8vY#bTW}SCgA38fQe}DlTJIAi zIWWsP?l)e$Z%x`Uwb?aU?~C}cRiWYh-XDEK6VyTOHn-!PZxo`S2+k4N(DA_>VHrT8 zoE)(xnzlj{I`mUO2K0abZTEI>7a%xn*ubHnh=T}c41qEyPo9Pk=SZ9bWrm0mEp|A8 z;$}~nFl^q4e8WbMNj)U%m?RmJC7Uf3rlUta zdHTfklhUP6n>Nxz|A}YNLq&fPvu5p6uxZsq6^bObji_0arg5`Yt*zU(T&r>A3bq>9 zY16DtQ^pr>-@VFIMN-BoPZ%$I3>~Y-xK@`@(U$3gMQRKZBweCt-W;V1pjy$iDT9To zG^aprpbVJ-17Sf99bU_xEwJD~+6N257*a)|!->Etwm66pN*pL+pkxW766Kqd(4(W& zQ-=*3Fk7B5p=t9AA)PiM`2;!?l2AyL&{Oi1G%C}jO`RS+^rvdjMp!9n&HHIqTTPUZ zRY)6=pd}4AZzU)fTM6Q&mog9Xr3_$x1vVHbbA&O6A+Ef`SUtk5u|_4rEJGS2TyVje zW?i({*(kyY|1%nCrDb7B$}DWH zGFBu57D&l~3d#l7p>O5o7hn=f=$9&n1eReQlW0@VJ05N`N@uk!b4zKA2touBE4rwe zAe}063oNXkw+VC1c&63tzGnFl(a%I(v?~^TSu2) zJ~8GOgCw$(Pveb;rkd?VrBr;MWa88xboLY!o_emLm!FXU+6E=FKynO%g~G*FT=rJT zsG}3^|D{SHl76&@CY*4BiZb;qvqluCnphetos7W+sViQF#2SutIvK05xXOtkdq^~E z5-{|L>uf2cECX*J1sjpD5_w?}LdDIo#~x555ynVZHk&1v*JUTIO= zN%Yz>u))IY1pjgTR86gURMl2v z|E*u1*31$LUT_Q8#v$<SKEl8%kq%hF2}7+AauE^izzb2@ zgBMx=J7&#pb}xAX7>Je=o$$_1+A2?)nr6JHz3D09`U6iCVYRH$;uCp^9-!Wkhj{&h zL1tqR_qNwBBD!sRv)F?&P%(!pIMHT?m_#`kQ;CTcp$I7=1u0Mwh%SzyaQ4fe#jq%d zQRt#=e36{TV0E)Oc)^KqTwnv|_`uS+Q8l*e00l)b1Ppe>4M~_m7QkSgLb9O_BO_7C zb3CY}5RT9fI04Uh%!MDO8Ks4AdPr|aIY1q`!Gw4*XgTX?E%oU7e$%YVd*-~k% zrAu3{TE2=ov!=~gtY)&>$+M@=ou*g?HAS>&(Njl}nmVPFsHdk;qei`isjAgWShHS& z1PK$@uaCltCG_ah&P!y!ss$SslGwL!AE}Ki)-BgYdL9wFWNO~Md-DR%lQ%D(;luJ0 zD`r=YakdQ3^Q7O`I)vKYW%GxTR61c zwp(t#O*2h!!VzPfalUkT-g6+vvdVNjRYz1Rrg)NKCQoJJq9-i2m`PQhc!gD0TX7{9 zS6*c@jCbG-lblH6t!Lzs%eD7je0~Y$q+cfuz}GRUtEDHrdM?8=@U;dAu1D~GNH$h-_0`2cyJbpWn)!JW@VPKoI}kijSvC}fqLrcT(ZluvdT`$ib7papHyq@wb*`AXp2y>=;F8E zQUZy%T#4JrxjX7b2qBQ_!3G~ciNAt#pmEA2qMr2c?z10qGm>2A#$iV0ii>RXlP~bkOhC@rL@6w)=-4@8fK<>x;e)Ng{R0?lLCfZhOkMMG;g{ zP!yC?{KO|ZxydV_gQu1}=Ornz#d3ZW4!0rag2#hc-Du?(z&uYd8Pk}qrbNB!nNV<% zImhuEDe-uT_aTXGMDjgTh+QwD5PVppGfC`KZylS|MnD%mq0KjxFC;6g3+ep z2&9QnjG`2$*c)q9a2OCNPVtPF!G|r+Zg=}&2n&Ol5uVV5l*!&Xn!$>27>*DZsly-= z(Ut7@?tp!AmM!%7z#_IpiAxNmK?u?eV>AOAhs2OHpn;}FQlpWOTqGkW37kb*Qj))E zh9))Hn@w(V7|obsn-b|7@2q51Ow?i*y~w;KdGKO~IgALUbViS~W$(Vpu`g)j2iynbGcjQ^C9K+l+tb2N30tN=$hSOEz_ zG~zQ3J;%ieqtuE14SW4L2S+pNnvaUqnP;trGqKSPlTPTQ6H2K!rSVNPQNuSdjVUyU z;Ym+EQIy4jMq9sQ3n3Bjr$7zrQ1$7&#*(oxf%&KOXgSf-P(~V2?Zzvr>Pv@$<5q^T zPed!rpvj0;tQ&<5T0z>4vraRaZG~$!tr=Hv|3YJ%c|~U-qxjP#M$m!K$q7ynINV?a zuZV_4Y+@A~3&#HCxzGcsJfzDp(i)U9)JTOhH|xt(*a93z^`{w4*dWQEHnp#LrdnTn z&AQ%Jrn@~zn~2Aplz?cseliLH1Gp_rc;XUK$wXEJjJv0pMH)aV?3|W+B%wBUpU;gj z#*ix6>RQ*J<-mq1w#yYyyaE~)K4E1#%35er^OzQjq;Cq+ra&fV7P~N_Oz`U`6sgE5 zH-w6Rp@O@tKw>M6fD73cMYczgZBjfV9Y#L)gi|H>r^;n8d6xI!4o0}2&y(!l_C~^q zrlX+jXsU**5su9o%M%i8Se+!u5+gnb|BpSnV|A``;~d*rDppYo?eI63w>+v{Ub7UZ zr1r1z_3K{yGBm!NOjyH88A-BwaAPG5LRnI`giEd7m%l6-YY)2@-o@oMP06owavm7sY`jzQ%u0Ms00SEe@#JDzy9^82u84}Z7OS9+nS{+Wjdaj z%@fU_24U+tq(`S`V$QvCcwk5woTiMp$!+c{#2^Mb|48}bM)f&)dCF=5r<&2&00#7-PuW~^wzFxiI@J|9 zZ8^hVT)?8TsvPR*Ssd{G}<4v~E#{fIA&Y?P}R&VqAHi-R|zpcc?Js?@JkqP)u>hpD55J&XI9T zkeEayLD3l98Eg^ZrgdxYg6k08c#}fd@hEXD)2AtDI?7QEPoUivkAN2p&jyK1nEHmS z_#bGX5{jLGrtm<_{Y^p?6C*Mn7l91P6c0jtgA{Tge$}KQ4=IpPE}xyoNoP8T(fpUT z7D&xqVzn)wq+Lkb>wpO@|AjrSAJBuD^rlbyBPOMXGdGkL9~tC8jv>rp+TW4)cjPy< z>CKgDGo=6+fZRk^bu~O?Gvyo9aD9ZeU=Fi=Tek}u2Y%rRa2OXhP+@jmBQ{oJB^x7UV#+jw$%GBGg;D~DTjHcwnUqNG#DF+; zPQAfaS2TGRS9!~oaoOf|kkxsfrypatX=Z1FxX>tM;a{vE4Hi>rk%b>m2zsdDAK-9a zE*KjzXkxELgUXZ}-IRkmNLMb!gXIK-q11rA@qk5W3s4qijmKb0n0b>nACd(^NR=P8 zv}x=B4yHhb3)N6s|M(a7@IhclMus?0Y9xj(XjbWUhH03FG+0{!7)g&bhlr$G@+C!% zcU*diBz>5K7Py30W--wtej5mep?406xQOf!44mbN^I#8=2#k?~ z!Hq_dV^^^iH$rp_M;5Ra7CG}4gy17jHYC(`j#7pTjqr;5#E$D2i{qz(Wdw$ZsEEyA zk8-g*kaP^h|G;9w7YvGL3(nyzB9eOt#6!0iD1FCc0JdXF=M`=N7mUI>JqI?FGH_Tk zXa&L=}u`30;weR9zT$mGx!pV0JSZ4C^<7 zJ9dyX`RP`C*%#LU<~pQ4219nc)wI;`_^(3v)l!YDN}2*kxGvjxgVn?b{z z2NyO!mosUT2-eAPZLuRf@|Q(-6-&8vHS!b^I-%Yu9lNkinz@Qwq#T~y;!`l0@&y{vE~&FR&`Cc*Cv<&QcVBTR|K(qMN2Gem z6i2ZXNcwkw7kdVTq(aFP3WO(q>vUUdwF@zUN?m#$;3=Z^bdnSU4JKNi+qR}`3Q%r3c5v#V@i3=6 zGe?i$Ura$04tOreYeVplYTOMymHf4`4S&rwNmmYAl#=3a?NN9NV$crGe9xwWKApVn~KJYqR@`v(BWiuLX@f>$B8wOm3Ke z!I6NSAEhRWwsm(T`203mB^w` zMYC|rQT*Dk{%W^&d$-X9jeEON$O?pil}f$UkT21D+o(XnPz_8=ZB7fC=h&%UIR(m&+JGp(+fv3?Dmm90BKn-VGo+}GlY74Vr_GM#ex^&yKx;uc8|HP{cTaB8! zL=Vws4`~xT@uc0TV~BE*wgaSVffcVnSBIM(oeH8)3$>u>sYzrDXgQuH`itS0ycNb& zq6ZVti)P>uX6GQUH>JzJs)ov|GCo$&F0v3IB6Ld08Vwsyjcn77VJOuvTP9 zCZI|-G#G(vr^2+v^P$=LrS1V^ocf)@s~oY=tyEjJX#0-b7P(s14qHpFGZ7EXpsr_= z3AyJ9fyxR|EX9HP38A2uG{Tg$gOOpeC|)d>jWS0?hM+%3m~|kP7eSQ+w<%azFvON< zMj$?LJjZm*m|!Uln98BTi>)*~rXH%p=7=7#014hFz~m{5o$IoP|6#uEP4?k4@=AjMsRZUnQ|)E zm~fnKal9{%+0FL?%dt$H#s+ZYoNSUDN6aaLU?YOjIb;YbbSTVlYOxiufF`=!Q^6d} z6${8ad?dtd%zy~QM6AfM)D8xns&bhQx$p||APtuw&EX?HyEZQXmuvvaYylc*0!k^I ztj^I{Gt>#v_yargY!@bNBRKM7n2>Z4n#CflV-(6e-?$Vz|1lFkg2xaW3`t}>6uZyB z`^Wg39RG|96$8Y=_=~4%zy{q8T!x4W&Cm{A2g7*h zJ4PD9yn_@>%A~R9q_lbyhq@A93Vea&M9ZgE&=3&}$wfV_zk1!ztk@nz%_O6WwvTn5 zPPo)YY|!+Y4#B_*@<0uja1mc1NA{z4dRZtR92NibKTk(^QI~tIU=uz05(!ZfaZP>l zR}h-StEwGL&B}n!*HBGfh<|>IPUYRKzk!F+VApu<$LwvxVtO7hh6{xJ*X;1Pq?*hJ z9uEhN;Grja$;}SbfC*OUOQ(DkJM8R;h+o=QV!NI9MEtZ5kd^e01ab; z8?a#;Wi_|^s#X-PUf#{O8Lr*qElHA;Q=QbS!DLtO8sa(aTm75YZf)ZIi{kF#eZ?HA zExwMwn5G1-WiH#ujO@swXAGx+<2r6Xr(g@||Bw&)0Oa-{fCgD`1V^9- zsGcxbo(%vSP8F=$ysDE3u@LBc6K9R2IQFM0!W6i$O(OoZy`7PAMgQ}Mzw?H_^EYq`4ue6GiuSj|qB^5pU~?ECSU?Czyi~M{nu~(ArJx<|4;!Q@BtqX0xV$tCb0c15c!y&`HjB>J)Z?~@cwTA zG(*$ISvfGM3~cF^FZTJ$uw0yM3=mfYPI>YOnlxOma0SDKD;L9t5hY68RWahOiMT3a zG-bs}9=&f8C&!x+GFJ;b**Ulz8m+W-1Ye&r!IB%ZxFwybj2NR@B zo(R0M^hr{sS>(vck_8JItZ1+txnaVE39unPjQtS8EZMOZ98mDk)`JDOaV?My;lc$D z95-&b(2Ju97A#AaP@(ch&KAU9(ky1&cyS%bkt6qk+{d!zL76pg=G-~aqd}&mAyf!4 zSgu?aGiJo7(c{I}9zTX0{|T*H%9AWv!i-7Nx67M2ck1*B4xCUXF=80~VT1|OEljU` z`LgAWRltC;W(V@s1q-`kEmWu=mppj~Ysa5w-`;|UvL;yUwW}A%{U%F}WND-5&>=`3 z5pY0A3LFp<1QS$H!AlUl1d;_Kln@h7D#V2vX>uuTH4a^y$f8|lx#&aLKoW_h+i+7! zH+tgf?YEkIYbPFd(y@^^OuPw7k1L#;E{!_+7$gxwiX?={{}fSUD04viy@0OAG~ zLSVs!v&N$Uy|uQaAUy}jqu|T*#su@s^WbBlN-O8n>rEiA$U==mD5>zy3Qx)N6h8a( zvrkr7`STP(12yy&|3ni-)D~MDT1c91NL#3();grL(n~9v1yd3?GO@N4Rn!eeQgy0n zCmYjYhngJ0F=Y_yfb4@12qp9+6G|3=GRmv8I)VnhzBB7A4=OnGSY#b&pn>$3U3LLy z(X5~?5UQ<rLry{5 zrBOy3rO2aCQ503Bc?y1!)R$(Y@l;gTSrwCN(m7?2$A*N&lT#i-?V(^|*+kc^_Ol8I zVC@oi*bj;|R#|7GMb=qppN;uhm#3w6zOOZ>coB1`3FTXwwJGnZ|4W|mrC}a$JY;Pa>u*N3T;H&%OtSmYU!FyEJ z9`!}*abU7pTiEk5m?>ZZN?gFq9N+;EjD>tR$bu*WIKa>qP>V?u8W&NwG}Il08rXoK zh8AMG+)j=V>s&u6$w5g4PVhqK?iV0JY&Kug$gsUDxF$g30co&vqB;E{5a!vY;p|KSLX)C&#f z+a2+!6HL%zSp$~XMEhkG1W*h?fZH;c#gPXtD}$f1=-1lUHaNlxfPf_5V__VCA+15W zjF39xnX-N+&w(WCBlI>_K)*s7&4_D4WBjkLsb(UqNQFjd`N5RNqeU)q$)sTf%^wFD zy{{O=7L4+oD}bR5OQ@0w?8Bt4^zZ>fbwJD}rvL+V)@Dg9@OlKCGNqQuOJ-&*n)m5X z_Q)0odMFTtF7cpaI|!`HUiPsY^w?owgU~ES&7orqOp6FJ6^-6SGYC2`W)|;7mi~=R zYLaPhoFW+Mo@a0oRlS!Xw(!4b659W0@f)yQh1JB|1r@*LGY|7aPOSWr7AD~D16 ztyS}{C;Vk<=|B&7qBun@PSHOJ3Q&P+=%NHMXw$COwPk#0e`&kXv4F-w?Ks#w zCePfNP6s$xvF=w8q7GjO5+Mpvh%9s`XD$E?$*^?JRSR{J?Mzd()+6OrBQ>cY2n#9A zVk~FDx}OVYID~&4Tcv&g1W&kmFwAatf*RDI>mt`*n-NQP{k83Kk9$dz7LIO^9F5jK zd5kfV@0bsZil+zLd74MbiI}?A?pE9tXBW6WS1*plP=RND{G?IdobEt0QXrB_i>9p7@*QA zAOZ>+3RE4{fhDFPn&fMSoFvSuF6+N2ilTWEEzPR3)tWsB zd#weSwb5$}wn&6-$RaHYLj$rvGUOuU%R5|PF}?#q|FP+vSl}13Stv%SK8?V>WlAO% zWTwUQv1pP(R+xueNCY8)giQE^MbJFHZ~-R~A62`bq>?f!v>%vhpY}j1&8kE(vA>o% zvjONt2Qz?&+p?v5Di5Fl1Mq-c@CE@Inxfe~-m5?|#6aS6hH6kgHRLQcnAiwB7{p21yMkQDZvsFs5dF00TZ}@s4I_6 zQkIy(GI885`8gIWtE4b7lQUt*W#Pn58~_5qDkFLp24EKQXn+JT03!$n;FAVeDk-`% z2DKZ8vlACvXsAE|6haXce>8>;gfTXZ!`_iY{}Jq$HyRu9tHWVDHF$VTxQA8*7TrwYAR_s^QMqtE+R8WW;>&SM7)GXn-kbtI9aB z-1;!!f(oe6u;C)E*+dE*(1Ag4hO*=k|BJN9wPefbo5MGxz7tG^6P(LeSce<~Ns$~c z!#c@aP)TDT1U7gADo}(V1cFAQNg5!5MvS`0Ob?zE%F9g8%lsrzq8xvt0DS~a0q8^t zQ?1Hu0Jca?21@`9Xb$5luH#xR<@!$nrOgfNtqfy=NBFDdYop+NP~m(~UL-uidn349 zPH6CjR!9eAx=R*ZDd30^>aH5UWKZ?H(MkNI zNerSY8~_2B&jE0_mZ7S9L`{ZcfEZAW5?iY|Yf?I^Gs?i5#ySPxw1rb(O9;)X(Oo)f;{DL3Yf)u3zu?PX5g3Ku%p|fZ9|ck&%{oxR&-iRD2>61r`V2seR7sswKnsvZcm-z&h6dGAPTkVr?9zrX z1?2PvF(uO+Gt<1hH1JCYHg!|%d;&R0(Hj^G78s}T88baa5Bw^?^XxT0^-~*-%mpKW zcr;WA!%z5(8BnBv&t$j+@PLVnkOpB8W}^^1sVIvQKU**cX$XcI%hFfqREwm(ab2iT zMb2T^g;Vf`!$Z~ag27a2RbzOBI-r6-NTea;87X1R7!9~R<;lJ`&=#jY*vO-fFH;h|8Q}LgbJ5~Y_W{Z*mTi7YVg)m2-kl3xP(-cgv?Sd?b2QJ zmrS6(8xvD@^-y<3M&Ovab+D0OXj5k}zc)~W6lKg1P)sPh0JT_vq1w}cwNb9KDuPwG zty8#VfdB|tIATp$c@)iPfq-R!PiNhy2B-t#D??X;rC6$(vMnigA->Y_R#On!ksaBN z3s<-ORFpkIVshD*dxe+{Ni%&3a-#`8G@+YK2V-bcX)wP(P!cTQ#tR7ADY?}OFj^T6 zy?|9u*J|2c+s9Cn9QdRktEEqWsz=Y<65Rb1~Z3%uwGZ)7L)L{H4U zQ3znq1shoNO(OC2M9rN_E8AKK2;l@!U#l_z3P=Q36x$07NZF;|ZunUH#ozpmTOame zE9LO2C*f(^HOoCO~qP)?o zVj^TaMX*L66hb`Z;u`&=rzPV}_S1+}B3@O;2EZp%PS|;LN6DF%MeSOu zM60w~(zOaP*|bd~7zAU;1>5yyeg5G6t{dMrb00EM=QML+hARQ)@XwcK z4kL)^m!4_lqG{#O17oP&J^o|y+vlHFlt8wHM)=YQ?rFv5IG^q~$BuTvi^lCTq?1wqii?YOZLwZsZ(dr{O>52l%-vQ1+=fr8 z8sP*3#kDY&GaK$Boq{`CaBB)ABPo)yn$&H@XX*A~@nh^CzVKegZba!e?luN}`0is= zRcKmX8=(eBpoZgU=r%~CDPa@V6AyiJfD1?*#i{5sVKtttOw0AP*^9^1ZQ&sGZ#I)! zs2y-B`;w{ZTB|aG386TO+c=2IUt4&HSfX&=weV)taE1J7h@x&F&TfU+?(Sx4{}J~- zOdH&4fUa@y?4I3~N*)&0%Qro>02IIhHc5-}#2+L~IHIho2Xn0mBUaE{%G%CrsY+C> z4N7L=aVAfIeq=jIUzby)oX(aShr@M-bif2y zr{r00T(4-o54Zpp)%Ot4oSXF5#_?jy1@dAq_+zhaA|GQN4c(_aGbYag|2Qr_X_sST z2*`5zE3(aYgy8o5t!{Du@{gbLQ5U>jIQMiP=J%Zt8?EC5eM&ekHLkmDVK+NG@w(WoeNX@DV+%mxWILs9J8GiXQj1m2Q%lP zCwd@nEumLy%PilYZ!H6efv^S0sDIsxKNqyi*mg<7OwaJE_j0Zed5{-(M1cgsD|MtM zq?Q=_nA1y}xY=>Y223ypb`Xj=xFIxffe6TV7Bzt!0t*}v0vBle|E_MeAR@iaC22t~ zXJkM2G!FK_7xKX8I(-6XL@oRmE`gA31?h+7Se9i>;FDRl)V=BM>cj+1-|}$JeDUA< zpZ_PO{X|yg62Dn*z=U8}{WoZRt;m@!s|z6rPaj;Q>YY)|0*D0y8wecOpn-t| z2?!``$WS4H0TLTZBoI*|#sm@(C>($QW5$LGMk-Wru)#L}8rtXLgo>U1g8s7sqlotpGgtW>y$?K)+v9lfw($C51@ zHXhovY1_qX=eFItxZW@YYj^6+95`sO&~Rbmg9QsAZUCWi|Ko;>5EmX)sPN!{gUAFA z3RGZVWM!5uEnWoa+2iNX7(WhxSW?01gDDxTY*`Y*4LY*WZK z1&1Aa_#uc>T=B(EK*=VQEv$ILiY-bh*GhHH$vES2(Xp}%S1ewa9gkvpx7K&yrIXG$ zo|xB49aO{-2NpM&5W)u`m_V3cK;RGpe*rGgAAtV}|75_I1&SFUXBvgZS!V+XuqK-x zCBP9#2*@dCgsiQ`+Jy~Fq0>$|=|oc>de{UgPnZ~!;)*U3*UD2gIvUkcu{3hjF23Nx z)OFi&*Q0hnx)r2bLymLGEAb#ng&OSn1*Kq108t+fA3z4+0uA^lW=aL=Dv)Gb`X?ZQ z4?-xXnrs@&U`Po_cqg6;am0Y0F%2>;wSy3HEw^0+D7wqN z@(6M`#&Xn-Xpv=4k3X*U7QUjcXlfl`q&kEPE|4H=1tG9-a0nhapetnyC{WpDmhoDv zWc~TqYk&!9){+DgXrO@v2ox|f$;JxsS(~M`|753xtwodov{#%m^C`?t)nakB=)AKn zx%lj}G0u#eC{i$*%c#2PI=8NL?!IEnj+}OCFTQWBqwgv4=qv(jj*LLZ5@hf<;29JkaseqzWHLw!v25qc4SeAY zt?0;E8f`Cy6eaSJAB1OR5R0>9@sDk zCMAYHlCew!JOH+nq@)2Ba+64GB@pICpo1NpKniF;g6Sb(d)s3Z$x`UOzG)x_IjA1_ z+LV9>R6v3#NndH8H3j$aP;&6oT;!-RKSVJlMlfpBa*#F^(@kYksT;<-`Uk)O`baHo zK}+n~F(e`#Fc%42AQoJ30m+~QH41>hK`NvYXIU?X%344KCV&A9aA1xYNI?of&;T`^ zPyl;NAt1Y#ffWQH2POE}518Nq1H|xT10X;HC}4pPfB*yzSmQ*XWrQAbQfQf@+~gwX zxgnAZIgBD55+8*>bTxt%PmH4f|6cdH?RbhUSrpYcTH%R#c##c%P(&7PFvf+|DkaLY zkcEh4Jrkag0C1FJ2S(5V4s<|-d&J)L{5ZHdakHC*`(6%Ku!0i&;0ZdY00EAbxCr`= zk`|(O~ES3<}Hw3oK9p3XF{csNu-RG(gfm znv8FJ)4&BHfPoRLl(8gmKuq@*zQFd)n}x$^;3TkuowC3KJ_QLwRAMU%GzJ7H0D)gK z2!RsJBn@e>iECpkTN2Thwj(Oh7c`WJu70(kOJS5i1uE945W6giR179)Un$wdY3^0ulj%)j$an3r&@hU;*Ww?0G{L$jkmM z2!QjL4m$f;izrK3YdZ*OEBVfNHUPZ0F#>NAtYF^w#shuetv?|(TqYK`tY>9~G+O7K zdU+>{`6ALdpi|vC|6G9uK5zjDz(ygBAOO5EkU%yEH{ZRT*R+dSzylVmg7%VZPUns9 zO}BShoCd+ZBNIT2JzxPcJ;XAXiC82X;{gvefWQsVKy45_8zV45Hca?3n87>+CUA(% zW44VBcI(v$L&difo>7Hyfm{sJ>qi{s&J`hAwTapy5$!OB9?W^AESXUO#bSVO5}?h& z$@jhIMFFIFH31Rq*uC6@FJ((u((FmV3RaN7kOe?PpEem+53^Mb6-JUXLcjyHeKo8} zB->fXmbOeNk5?f`d zfF?A-+&0}dw?F1Fa-zTi7H|O#WN?D^VwU49E5hCkTm{v*r`tBo z(vv>3{JkOX0dkAf4HL?8+ zWZ)*qxJNi2=RkaiJ*@{!OamH>fCLYyImm8q)12S8aD#PZXbWVqp{BY57OYSMuHZ>~ zQa*F||BN5hS0weRJF4oY!1_|OE^%Qux7fDyuokx{cCt%j4o4utVj`20G!5VhWC-bD z2WR&={l@O-t)vTtAOsn>Kn5hRz@=SCy*V{n-37>iO&j@0vP3}~U<`sCtv`YZV!tqWd!`9kz&+nE8aE}t z6nH})@Xa`(K=BD*U--cBU0NDE!tR+D&Xv^2+??SZ%M9ttNC-&SL5(vTG`G5}~9}{Z8E7-#nT$;!X*7h8hGMNkmjEw^k z#DIL@;tkJ9oB}5Sk>yNY3a(%aMjZ^M%OISeEzH?4tRHi=Us-5Mcc5OV_+TH9!!HCA zVCa>86y3{w1Q4J>GL2#OY+J|Vz#y!E1h|k3WI-Hk!Y0H4d&qzcpnw9*lm#OwchNUlAb*Hh>)7lja0NF&aZYC8IJLBQm<+aO@$voPrF} zATFHMDFotLjRomd(IH|{#Z6Q&_<=R70u{KxBRbHnXvCWc01&{zC63JXXyPY+|AA%& z!57RyC)|QQqCzQNp$wqYVf8^8h|jjAkoFADnq=DHut@?m9%R%?5ncwWHO5Cl%kdQ0 z7hu98bju@bWJiAFRB2>KYNS;)RYxYmMjl+kJtH(aiYZKEEa1W`n1U$;gCJ((uuTn~ zeVx_J&NvvuA-IAXI0=4a3DC8Knz#TQXh28>67#iC5LiJU_(47$qWWf+r zfe$ReOnpHPV4${e=X2^ngY|)6vLs>3NGkln493DNBql2?Ci`(6>2(+)$_|JD zr6J(o1>^@rLL`LZW=5MhrlJv%r)BP(URWXJsrzXdQ&upb_L9k8^6smT_5_g;|JrNS7fLorPah zZyUzf!GbYrjN0gSbP5|?>OfFR9HpSBgi@kzbm~B))e#~{NGc-Y1_KchDG^YAZb+%9 zfQ8A+`xl&ZKF@j1bME{8Uf1P=#@QT0?D{POKX?MumB9JP_bk67aZ_V+$Gm6DF~e_QG}qsk~$1~FBv|pTszF@ z)5w!5QQtAInhCcOtXf6AC4H*ztyFmbbI}a&PHvo9dBFVwq3Ro&3+A#U%$W8?=t45! z=nxgF!&6{_4#f2r>mi#@-au3>NWq3}l`aCAO!?syog!OtxgDul8VD`EJ z;|Wva@E9@jZ^fRk701JBt878lwhmg(4teeUE5=&drH}GY!b5IJ#@=WQRa456PbJp_ zF^k)Zp=(!SJ{@igcm{}Ks+zI1MoK^Z9Fidbv2rYx()L; zDsoS|8BhNeKkMe)IeEPLR@T_~YPWUK#P{$&dk)t1Y2*Gl3{}5X-3k0gazWkP!c{0y z$5xZnFLU~%xPbX+h$YVD;;5{CkUJ!RiA2*%93wX#bJ3klkxnXVo%wo`Db8j6_h}Hr zaFH>#Z>$2KiuSad3^lpGjNs~Y6fvjH6v`{TUDB^v3ixlSlcU}p?l$A@&EH-{k7?vv zKdrg-VZ!!cqSi+em zUb3atl9s?FG5UGNEkCLl@~(EjEozoQC%lGF>4Z9{wIVDRw?ErmxhW;dp8R!c=aNZx zB4z$gw^6v{W_x=A6~PU_*VE)6w(40QzfJSqMSLZJc7 zu=0xWs-7+@nnU(%K)xA^t~EJb1sAjbz1b(&;Q=uvr|#>o_-3Qw#l z`fxW>_Q%CQ+EDXo^tr7;`BUwIE-#-fYc6Q%k-oSns@P&`KFbA;Eg~_$?}UqL8+7;A zD%%-YRyL}9A*o&hXYF~Rx^hw9WQ~i`4k;b~;z`+j{s5(#U}$#x`KnU1rL%;&e~d~f>u^@KrUWc0FxD$s^H;)<+o6A9?KIm8uDV;EIKwIUxB zKYVO|Jv1~oXY7=w!Ajj%?WWE%ou^k_V-jyE?14`m4ggdxJW_*SDq}h}CIU88xS%b- z6)EH63g0~5fNaWxr39N|p)8^^Nb}eY;*)Kz-oZ0=FLI!@YtR7d+*Vhoi^{m9^933r zokTnxCv!4#j&(&QMVN8QYS#4{XfjeEXsG@&RDxDIT zc}Gq5i(PvfqlEj_XBZSoQ)j0HOB-vR{z2R2aw{rY`c!|D?Kd2Q?EQPQsavl0n*k#2 z&R(Zxmp>ar^(LK*+{l$5S%u-*#o=W)Rz>;Tlg*)Ct8s3d-&evMlp#N&WcB}e80h5> z7*XPTTUL~RonhdrPK#0-=km{l#K&oyXfXQ;c`U;8EzLTS=HQ4#R5(67F6s8lx9qq% zuP(r|5oYCgROUB*8dEH7nDZ}!)4xrmQ+T3QDO+vEUI6LpzOGYtwmFD+GyjR69;l_p z4>K>jJz&=5R*}O8@#n1^k8of>3itDDHgJooej20^e%JbY$LuEctK($=Ynpbyk(GcPnb|oVq{z250uPvTnSE$d1lP5|Au) zkISaETD4zKIhh|aO)x$0ns^|l_(K1j`D5El-_!3j4M-3yW7Rf%5WrTZbceZSUV^$A z>+4=|xWEGe?Zg$GNcfQ$dOiLyo4LypHfQBBhxion&S(}r?2uAa=Z)ww`)Bmm~lsr1k$?6&DnW|ywft0rL@fXo34l*~@DDe^9jN?CZfI<> zUWicdVKgI+JFM+EM@5FR1rgG-F?W(-duT-Wp2(}lMzPO-y6PFnk6{nD^xQuC?1C-s zw(Yp+U$=)2?4}Rw+U;xaVg}T+Qj|L3`tT^#-3#1UbxzKiH*k|FUerwh z+}|jB0Ea3{$??Q0@4npEB^#13GT+wuJ7x%h*f9NIU};ecw(j2FsKDn7Ui3~quUaH+ zE`911J=?GR^}8?hoQZ_#p!dJjfzDf(oHR!J)fl`+bVvTckM})K9sXUhXHum@BIHzf z|GChz2l@z9Alg2X15QJV>oMi@H6RE~x?TVW5Cp7FM@icv&|)BdCLAM0Sg#k7c1#?gGQ7Iat^8ed^PrI8Sd=ucPqYMp1cQJsxb)bXkx z2bee&D1o2tO?+89thg(2sxNX$U```mNC9g}ehtW+2lrnuLNn>n9l&S}lr%1?0+nJm*S^HLt<@If37SpcoUe&6 z+g`{q#9ns7M+_Ff=hR?_Ne!;5_kHeIrV}@YwNCYJ&K}FW`el+P+Vbs{m_xqEo-NMp z>^~{>DQHE(CHKErStTmGeqLQ|@KluQ}Rvs}f%OY?h4nyOmKEG8JKogO5muuAUtB z4NgpFd+#k!Yx>MRKIx({x6yU=%w*$cNg~|?oVC^S6+Zwkm+x@@M|6kNKhE>_l=I)LyA z68a6XZh#cG2mcmwc77gX} zZ~Nr_9TX|#;ng?_o|Md<3}cGriEQkb758N%FIg%sbzix6O?NR#DqHcw=3C}Z;mTRnTQAB! zebbnFodLAjQUrvVQcYT`u=|P@#6$Wkh%&9BY=Zq<9Ef&sFgSRQ%vbjbLia>O>WsYQ zB#wRQU7c9KFotcV0&po;Zm?}aZasCXEWR$b`=Y{OG%ah-CXpFqNTu!u$x8?%a<% zzpUH4<&v4tuUXxRsU)j00mW(4CzJ;9dqwDu8$|`csqqGDl@yHc;(~UNjAV9VwbmW} zl2%^Zlf!xqCC9%C;6hvM>Vvn^k7^aL2Mjy2a4k`!7-BVUr3t4Jgq>BP|s-DD>G-*73gfmXrcRhq`u zd$N2aPOJBeo(ObxIX&4~XA*V@y+ctZeE+JpVML<;re;-PtLp>4+I#+em+cPusD|VN+Dl7&fWP&$Oj5ynAnwD6eiNhO~@96 zt%z1J6}+ZapFH*KI>-xMHFG`dXOmWiNvA{gmzgQs2qsB6pxU{6ZI&3`XJj*0sEb<; zXFoY~abHbaWAehI2jSnoWjT#1=6Xpq6c{l<78+|G<3t>;^+Dp@>A@lX3x{m&zt?+4 zq<d*O^JQu&+I%p=f=bGaMlVOjP$)ZUbHfFqE3iset-CfSS z`6wBwu}9OAR3BkfSi6Pz4J0G4d!+6g2}#gH&AnZ*012f!of zjA>tZYlKRFnD3JhPXw`MEwLx?$zu91wqfgC*gMM)=`4}>^ap1@EmYnjtd`-PnEZS! z4n%eUEmE3}rRzL5S@n_lC2so6{MmzZj*NdfuP}e1x?iL7tkQx|{@mM>%0UQY1UXZM zdJs{&_nSy~QN+(O3z3uz5JvE9MlETv@5y=sR;^zuYAIeh(L zkG$QlmZqBC{Fn%wGGc#?dann9Xpn#qE&zi&oTPgfH&zhYX!2_8^o$EASJV^2c!8$^ zxqJERV?UkquFV1*YY~Ht6_H<`;M?`5=34hbF_(e@9a4_uZ4`s@0Pp96g`x&Qe_}p$ zSfKKm?yvZ^ee+pz=gHEmRe#wHn4*hP-&s4{5pfv+=SH|KAKkvF-K@m~EkYgER{-~; z00~clAht0@W$UZ!*2$+cUQP?MW2im0pJv?eJ2u6^5Jm3pYW9@RUTYAiv0q;7b(LI; zP?wb8cbZ3Vek9gPpFMhTK>b!=<)F2XM)TfU;4us)`*xiMZV$G#PGfJj1^p%i(sr%> zvMYVCs9E&y`k(^sw;x?=J2c{e&nL+{DVpdu*eMF!aP=i&1J0u3YaqMxSYNDeW4NSu zShDOEOZ;yYGM9$wJBGegC*r^QUz)R@QIoV78-Q=R@m)hD%0oJFBQSX)i#c%tu&SC@ zkdx#JnPWmOZ(Q?a%iI>l1N4a{!IHt*OFhq|MviEvuy%Y;i-&kRW{sQksJ|lvw*)D2 zZ-R)}D$IdK+k0XvK*bg^z6e>fbqVx!;H+z~35f%-Vp5E_Kz^R$xm903jW;+4 z(#BB?vK^#5o`vTCT}jyVXl$Zg5l*{^O1a;eE2@qE?HBR8QVG`JQJj#5S9>CrK}-0@ z#24Gb-yDZ;@0;wH+|@b!RHj`^?Ir1<5l?;#s4p(A|A8jwMMgz2-276v(_&7e0pOzp zz?7IbR4RCE6olkzRzPiVs&71_KgLaH-NtL@4{PjF^^!2a)D2^EH?lo-uHb{}#|?CU zxLDk=O%V*~+IZ@{o0Qs_i`@y{oXv%6?)p2gA)jZfSXYHBx`;R8NuIBgz6c~Rs|ZO| z(#$I9fFS%b;9K14w_@16RfnB|8%(4w;JJ!lZlRx1jOTE`_!Fwtz+T0 zH<^?IJ<&}8PK4!v;W=Qcz7~&7jlAc6&pB;hn|^X5@Yh5pKh%0(s9)`nmhQUs#uPZ1 zF{|@w!6e<~ZJtfV?fr{7-nfiUV|d!WF_|Z@h66#8^&2#0qmp2jUNldXL<`<548h;B z^EE)!*b^hk7H&ppuMZf6p@Xl)KL2T)NL6DR06Nx^ezG(3*jr)DZ70J}YY)iP_pyo? z15c8`nYMQpvHTR~IQBl$WugW=o$qqQ9y;XX}_( z?g$PEC6~%Q0%bp&W`1AJ`M#`2F6K)}M+rs$NQwjQl;Cq1vdty)o$?aJ3WT_>O{$M^ zRcD`6ByUDCfQL)wfQDMC?K?8@H*Zf*WjcRX+*iEiReaLF81Nq@X#3aTnXzxiRhO>O zM+r_8C5+?ZtLI0NLL5^{*&OekKNEd|*V~e!7he_OD~veno;n$>U{Vr$HZm~<8QL00 zR1$t+N(Sc&<-gMu{}aj|IH>p?822Ga@x74vhoQNohyJ~1M@X>Cxj56=Y4@3Z?+>U2 zN_Aze&Pc{jt4MJ`uB20_q2s^4|AZiNj$Aga-Y0tIyI8{aDDf&8MVjt~w53nqqLp8G zYyQCb0P(kiRDTx6uJ9BVUMQ@x6f8o8$$VG zG_(RoQt^hLeUNw|7lPKgee1bU1^Q8o3m!TtVVNQseZpAQJ8}EwD3~tzyrr7-VDoBd ztjW2z1h;jFP1jM;A7`&e_ilcR&XtlbvW$=avY!x2T1Iv?W|C~RaVXlO;2RU zDVmHo3XbI_04>G`j5%a zOi{8V0!ZuwP4;bQJKs|n0m@icNtm!?N`W$^Ea?Q`(PXk*sJUEY(1m+6aS@@Y2wCD{ zRqmM>*=lm$Q!X07Lg+970R=!cR@vns@o>`Ff6>- z2@+^W$Ey%}xW_YnwYGbN@ve)~#6aZ)1o1Q` zr|2__AVI@O(eMdmnNgnHj(4I;mBhAGkeGFl)NGJKlyRxie6caP3(Lwy5?Bv`^7#9B zdJ@Kq3WRY0J*|+*1Q|h)3`m&P>EteH>w|O0?+5A zP!tx)3X}8FQb5c)v1Q3ZCV__U^T$iku;omAQ&5#v9q|aS_=1qo9wfKPQ~XEkyYN$f z9H{t7R#B@8HOj!4aXc^-IGrq0Sk+ztM6|E?)_#g51*h(^W$(<%ozC90NmI54b@?9v z%2B}qsa-)s00jnUn*!JgX9qizrb_48SN#eaoUgupj7_arO#Y6;0vj*M-YZLS>aig3 zKQI6B75hh${Kt4yd%tIerqJ@TS(R6{G%uGxlL}=?m(uX90`O@rRs$$E-${(*$&Uyr zl7{+Xgoh6a@?Y{3g#s+YAK|&IIhstUGZ1_bosWRmHQv86< zfN{cfYgE1Y0`Q_AKggeNN`<8{?mD5-T;|mT2O%=1QLi+HIHU8dt2W9(#3d`j(i@&PWdtOWkVAcZUA{FaNezH45 zZnlcJeV!#($0KsddMzy3ma4wbvU$gOVsbom4@u;rFJPwfDNtqXvQUan#)dO*R)r<( zd)r}WDcF+x&q-E!2pdQOfRX2>t(XJ3%k@FB4Gz5%cgNtiqVbWL7_~zM=iW|AUlaN^ z-8wUM?cKfU0?X_2rq55bTz7~OD-9CY0EjmoQ1DD-{;g7A2Z?iDy*T$kT&fCb%R#n4 zQBh2((fsAdK)F{{b2o#C7lnk=eS{WX-y0esOXh}04=RfZ@%#01?iC<_BqIPS6jq5Z z2=v{+kgp*LHnN?s<^Q|?ACweu6Bs#t%NxA8`^}Ht6Mz4{k(LLWa6h^TCc-iW$ZOf# zYUd`aEOJ5()lzEO#wX9_9-DS~J#=qa!VLf1`@tiJoj`;hAdGf!2}Mk1NskH@ie}|Z zfVVe#s=|O@D!9;ADz+sIsl`CmRV_blmR}aiFZ1O64u5;NV-_7$n%lQ}p99kocqsh_ zC{iH=;QO#&U*Bi_R~G*Ptk(}6`@mBT=nL$Z2krdTfe?VT(ZDxt}URV zVZuV0B5Mlh&_|!ny~T_v{*}4*`8Z$HLY^iL{HN}_-a!=a+_%*IYvI&M={zzaMOX!_ zE@JI^JK1KLfSa##=oLJ^|KgdPfkW>2EHC)zM75e}`)pf{Bc@nX$C?Fp(hJ*mjr-&` zRpLcx_yfimeZG3sAjN$7;~i5WN0$l$38* z(%&3qor}#nx2gfa{!}1LVZP@Zy$Y0$5>uOfU|XTb%Qo=J5QIvoelzLU@9!~ zWFJm|Wn!*BF8YnzOf4G^ds=CER;@^5g6v%DR-twdDXy}wX?I)F3GF+&0o^HyIS-!r zv@%8$9+TO2MDw(@Cf!ijv&xw4%w(&oN&Y~ls%+cvPYtIryu9f@Ic?LuJACY?z7vh! z4M)bl9hqU%nWXx0j(Ap-*lASRq>fWmW&SY$l;k4`64A^1=AGh~y}hFvKT-wdflfW} zWBl_nZYmR2)4CW(l2Bo;D zHFhl%wQu(-`JcEu*p4!~AJjH14(4-3%n<2s-83;}18BpMjZHX8BB6Dsi=Dv9ke5Ff z`Ur0-V0&l?3c!047UWg1N$-ID*JKWr>SsV9&P*oV7DKWX^N5;2YMl+`UB{UfK~sQO zX4G?U9i!nZDR6_;6kjsOn+8&-HLik61(#L@CI*cQ@hzU@G={B;hXX;auD&`u>8sdW z%VnNM$PxW9ALXN_3-xa=mV_=KJDSQii3RN+7m#|+CfgnU;yIQ2RAfFimTo@2K1sLn zEeDHQT^NqG14~$K*n?r=FYU#Bba-N@V+`|0M(S5pZn`cYLRR*e&xKwl;1B=_x~(q9 zRsw%XER&e0Ku)Wr16NDh;|HB9Bi%TSM~x2G1!PFEfE zyTdslEVTV2<33zH$0!mYMzUQ}sY{a@CxytJ_ClfsEReTqC%aM8+CR* z7o*n;?=$_w1gM%pRI|t}4xFcQy*}G%Dy3wU0iOv(a=3rH!I=(R8orQiC%(uj&;e5L zGbE1dNYzC@KsEji6>h!0lS|bbQt;bsNHp0%k+V}3+OtdfIqM*?S^(VE3^b(B1wb(z zv}?762x-3Ngf|sflOliPm_~=s7^RrN6~gREDKcvS5#MpSnu|_GOUMqxr~8${Ee1M6 z4}qMU^#|Emr)#y(e}?%aqyT%IvwhP-2*IHlDy@uNmPRzVDnl6@%oXc76D)@E1!32g zY;?lN_>uJx*Ab74e$)Nz%qFMZQul^WEmlJiR4#xJM~7B&>G;L~Q7`U}fRc0B4c9L! z#{h!U9kjjgxxU-(>DPoOQf(VMa*%W?$ZyghUh6r|EqWM;03=jRL5sZiN~2G{B_Ti-@>!77Wh>c;q43AP73R@>NdZAK4YGLOFT#C0?^0k*L4I?%#F&Wz^D|A zbJ1nnby~Vnj|cqRXqxKrabF1%sk0OsulqmbRXOTniw<`6Xn<3#~sHD;g& z>n!MMyhVFf)M;O21ez#ddU&Tpx_?I=HSVwqEPEerfLQ2budX7NBKnFtpu+&jiUC+^ z?B_l0^%pJQM8F+5G|U@$LFIA*db9kX+KX9j%AMi=C~gd(3j0)$wiAS(Lw$&j<3Sao zY}?qAI?6h&kF{C>of7pseT699Flu@~ofd1zriu8x_w?^)!c1OAWs+;Au5M#5C(=HS zwjC={4%HMtMh!loMdW!YO*mq9$8qyx|Kvs$MT=KZb$1>UMx--=hfi?*EGLkGjG$pt zK@PSZS7@GGeNE_{ZMhts8&>q<`e%)2#@9Sho{*F?LFYe%k1!!_CetxLc8YQf&Krz9 z1E}#$q|RQdeIz5S_T~tx`frnTxiHUur}@p{0kj{I=8H7}AjWVM4EqKs##Wfe<(frs z%4Z!lO)%nTB#e)WDLJrKPyj3v8uX?;VHyr zPL?zXI@<#*jg9R8}dAjE!)5`8?5yi3Ba@Syg9)O(M>vK#=C z1bjXOAdq0LrpX@cBU-IT^t*O&Uw|w#*(od8aqEmI^_(MNzixW6!DWyw(=c8C{KC=n zgQd{ip>QAWc{w%sg(yUN6e9kGc6>?HKydJnOyy2V;>48EO&YR{tHZAHx*dewQW1$^ zixik9hNPn9HK6#c#KI`B6iMEV>g2B(YI0C8qo*H&7x*cmuS`j>;-09KBzt^otkk3A#*{n|5$xSm6-qec%4qk-Iu6{e=m$;SCMQQk(Pqy z12Fg3;eF$o=TdRw9E4|7-a997d<`pn2}GrY`3lUvDDbh>ye4UiCQbAkNpyT184VC& zuBRB|a!lx8!zdtxeq!g-E6N2I^K+WJa~fyCyO@XN04FDq0vnzvxRfq{PY|vk4_;^s z%QpiNO+Edi>y>YbUCED%7r!e~&?<6&95IVSRWneYwsK1h44-kOnu)IF9y=y*A;Ka< zvqK6<*Xm75w4-rx=AwLd$=SzHg`Xwo%Rne<=?+u!Y#sAv9s6<}bG5qwp9+zGccMsh zJGTs3PN1ADeOGopqVPd@?md;fw{ZKu{rf*WIv>9dvq2V(IV0_4@_Qb~Z#j8Y1Ccet zqG*JST#j-z6rP-M2($xYz*}ZgU;~iH^>} z!LM>lKKX);xnK>_^&1G_&2=oMlllUHy8DPe=v1amItTG9q)e6FpDhf!Mb`5zEXsD< z9ja|o2KiTiI#Kha3^p`I;-o8rV)~gAwc|NtEe@K8u5gwAN~IK*l6kumEg~IIuRj?aa>E56U2cIv1cB>{O(4_YTCYoxs_$o<%wz6zNO8T)D`_aZ9suohv;uOSGE3x*-XRE zGj5(LyNNg$k*r1h?NqI?oZs(KpXQ3l=s}e*_Z<+gx%jKz!0+md#D?9(#A*uaorOu! zLG1PNTF&^jS}j-}7r_7kZ-fKSt)qW)_ieROf8*#q0>s@HC)A@r%8arz~78S8a?-c+$67N<7vlf2<;Iy^fm}o_x9cVmk;fEi5y0&a zg3bv<=9$+~{5vNb4?f`{Pm*AJTfv5mGTyOVjYNP7y|8A^t}FQR+xR#a3YfyQQU6sC@vfYx5vPCuL>~;rx93dQm)%`~9uIPD3!u-c+crS9_ zJ{LFDDsuOCXCpvwjnwstV}fU)>nU&+Riu_Fa&!K6{W^MT9c)cSegD~O5$~L%^591U zx}1V+LrlQyd$0aq+1{P z@F*3kW^nHW2Oclji79&+pPAwKv+DfaqVkP<8bcR;Npm58;BWl`IsnMYL_7@0yLhVw zn}=Iupe1@mF7%2FaId`QU^j7CpMJE$8Z-sh&!YCWGMu>_R933lOUC1pUbBf-%z>VR z^$bLPD|$pAQrQZ(veI61>UI%qgGJZDUbBV{k^F3cFt|Yl$Kph==*idx-N3)u1Pb4M2THw$@MLuU^UkBjIiT5uh zJ%W2+ULc1rG>J4)P}FkX7y8c4p@v)G^l@Z<@&m^<%rlCJ_07`sRLXXM*+n|?mkRm? z2gPcI*K;uQ98^68$q;}{4bOW~v<|MHGnF~tu_p3>GIA&H$&%aoaB0{BBZyU+n|E*c zV`pd#73ySlFCG^Kf)53+RVCfDzkW92n!kV4?9lV%r*mt_=UnV-_i2Oq`W832wzIfN z3TmZSXnr?=P!Dn;sf1#A{>>bv{STn?1EishIf#pRL?O+dXan`l-uDE-tbYPQ$umhUxOp zJJwNxb^I5`b0HJm&PCl|Lp=qzU)-NDZBsA0tZqg-{4&nvb^^$i3q6WCP3JN?7TgZf zfg}OgE9wQ|H7uQrJooX%g=SB ztO#A(9(8*>*Eff#ZOe}ywg>MlFLl0A;BbdIZ}*z(`j^}O@=Dw5={CS~Pu=HJ9PF-% z$c6Ej?Q{{JC`gqB%#{mHVX8mgGn3JEI>KbfB*vwr_N*LT+OZU*Apk(e&lmu#xces` zOc@RkV6m-m;UV-O2R%YZGf(`tdM>?w^tHDD8q0>N9v?JfLryT3bkFfmMZwm7q(_&G z=Fl@no9-pg&mDV}@zO`YvfxVJ64>lP-eDtcF+xn`w9s9c?}~2Y2wB&T-D}1!GBCX) zR7I4SF9oI^2!;(Td=M`1GaJ>{K~`B12L@Q3E={0Qw}uT)-Kr>p!+$U{@OdxXaj!M zf*&8a|I*`0aOLi*Cjmv*qSt;`OkLBi91A2yD|~#>gh;1Q7&-6Fo>xl1rbIfD!yV0qO%1=K82`p7nU>EvQ(7KlNr42cg?7-;_qt~Oy#$>Mh z6RThT7(cHRdsC!S5;ddn<<^7w4@6;7Q_n-(s^J|}9{?l7VP_ba5h}W}68$u1b)84@IUolYaL{={*AHyt*4~1+rGSf zYW-F7cY@mGdQ*51VAnp<4_?bgfOSR@9g$eRoV0CaT%nxL`Kv0r6^XmjLG{0Icub!=ws_HV`QMwF2_fZTLI)#*rgubI9r zv_Jz>U}f(ankP;q*ypXX^_Afl<#(U=+Ny?&6{?=C?A)+*uoY7>xRa)@>>{P*)gQ_# zh=moI#}>Z|pG+I2SBH+hiuiK#X{A-Vh{tA)(|bjm^N2%(<=!7=nzIq|zeK*{YTMYO z*Bso6F%>qa{#*TN_+h-t=X!0MTS>|5z`k>Tzn_pUJtT-b%llh?#jI`D(D*1hH4lBI zYIns#s7p0U(Pr$=`Z?HNnb+Z`KlhbglxmhzHnlvmPUy&Z5~+vDjS>Ub3}mMfj8Fa{ z1O(+5sJdKR3#u6!5z{kH%G0cMm6Xx6AEi%qWMiuwGPkc)ZPq>Avf6W9p-|-Rt>=wv z_xhfdBXnjQV?~W^{Y_5Pbe)(Rx~g65^=U-=>O-ttUMmFpvXK&3=MhBAxKq71Hq91$zs|&pS{oxb zj%l~8xw+YNY=wNlmDJyv0%mv$>*d%c$Dyt%8>yX_7UNA=wgpCvdMd|k=3sRg|jk=k(5tni-rCtA#cvVWhkR5 z^*bv5`fz1bSjp~Vy_Abmmo*(Ee%3^Mn;9t9KGEg6=x;VEIVr|Yn#0slsq>C9d+lF? zi>JJ%r>~weLe}I{lxFG(2hGa(Y}@avk5_93N?SxUdU1AWN6199$z}Hbi}#k(M(=^K zlvxrK@6ILX8fKgfMso6{4By!-Qu*(0HsXV#bi zf8IlGwtpKkzOAk@ko4A}*i(uJLhYp^`ACgQL@3&kKz5KmggBpJB2uygDpgyRCk(yy zJB?w4S7T23K=q4+*l3*^LMs)zVg>J62#U~*)kstOw`{XrkRs7K`-U(?f~l@k<4jS- zAI;bxi2y46=_s6_gAEpif5lM`9 z`z|clW@{fQ*!SA9BCx-d1HKBDJz_ttGeX9qzgJ6F(D_Q!%yeZ24HMmc{mC&pShXk( z)dc2i9Mj(yB*E6KbQWy${c14>-EAdrt)^=<>E}OX;R)<%`xT9QH0O^z+&_s|f*cPt zgWh>rI^99VMy;JZ%2n-5!MoGfnLY~wq;XqzDO)PT6tIDI5{7L~rrI-LUlM=uTq`%h z*^OSObXPq2ItQv8Ivw_xBa%uEbAkB?-6Iu*G>2Vsl6!R^ONel@o8r^Hg-WNp8ass^ zmjWfT{31hSS7(Pn;wvKFi@XZTW{O%7xs?wDr&e;c)$y*6o!x^ki#-TuDE~4&7R9j0_K>uJL03bcv$BqvnD=X#t=L-#2q#E*ct(qN#(_C(*FzMOZAya&NAayn z$a!9vQAUoPgUa%F_q|DP#>l$AqjGl6gS~ft!7x_mFSN!ZJergU zu=#~RZdS=$OMc!^_=2H1V_`7DM@ehxCoNE7Z>cMKQgQZM&|4Hoaa^~%1{kh8&6&k{jjYl%> zLAK?#sEB^?C|Q#a^1C()@oB4e*UEkf#*cl#T>`kx)ZUb${1M)KV#QatTALTUq)&H( zZm{-N2EQs#l`gg$&z zzVOfJ{=19zc)!5$*uCm-C3;*-{7&oV^iwJe6`3_bg{Qqr_u`Wob|$~MPu+(56Y9t1 zEo4=B7dQ}=`gSX8)7yLIUHQtj@Rqh&&4Cv+d^u}g&P;jpMCa~f*}rWagKKB?iv#&e zCgd{0hXm1M>?_iB{y4+Rd2-9el!FEIMX&g8XAHmGx)j!-JVTyKW8K#%wtQ#$P=4EA z^7Enk73-2r|MRUPUe5h{Lb;Y&J}>8I$5cCd&Pka65#owC#R?Y_bP$4a6)UG3CVqd$1*(ymaB5S z!}w>4b!W2bJkoKa+7<`b4E02=-*|T`y=U6r5*xMUaw70meBZZx%!N#_AkHUE#kI{y z{=+PW&ZJ2d3$Yy{U>s(9!_Kq$Sk|jUN8&R74SEEp2DA~6G=z}9gWJwIvqlTIPclS` z9bc^J=ma7zUNA)YaKKWCC2sK#&u0}gFazL&tZVRdt7QpSkanQ)qlszJZLPXdJs(&- ziN|$gR>dhjJ+n_N`dVR;<>@}$jF|2R4&lni)Km;#%a~La=3L-Pg9nk)XQGXl_v`uO zmK8AjvRW<6XvhyW*6;mq5}SYu+?}ZQD?T!11skAUgoiaiTNx5ingo=}Z9J`>%VJ_a8pfzROUmyT`rcv?aB@-_%(k3i47r$iBS~0rh9Vq3%0bMQYAx zsRM)zgl~F;2K;`s@~g9oMy;t^+1GcHEGFtRY4+Nzs5JQkj2^ptc{{f6EeW~$<(5iW z*}DqbQY(*0N0NfD>;=TtQkD#&i(bS+kOpxaklZ>zG>fGx#Gf?GDQ6bf&h?HR7yUbx zb8jmrdZXVSN8PRvHeM(``2zaZ?BD6djZvl)MA0!00!_BhflqFf*yBnU%d$ag)}6p_9!94gjm z@vz(U2p<(W3mwdYhT-7H=`as=>H}nVX}%|b{y>A z>rktV(r;=FQhH+P(VSmoaRBhR0OB$qJQP(rz-JD{Fdhd|Ap212Wv_;myP-i;_^Iie zQo@>aBtfco(rXB+pr71r2~)OOmtCj;wV*~^Gr#BS9WZ`l*pfv6pM?>MV*@uHy* z$n3+&#_y30b}AYFL|MzNL!z$L*{xZO8W5=&R0|#3-|4-Yt9Q(ZBH~gQ3P0+e=grKB zT75!Y2c1Vk_Dykh%uNMKPmmYWD6OjF1 z)Wv6OSrUX4oqABj7XTap{O&d=$_1|1-ynT;)&E&VO3_pbPPOnsQ5fJ?_7=_Witi;r zOgwTKUUi3YV~PHDZ{5eRs`@+e3g=Q~?`1<*j50%+JDo>J!A6SOl>RVEMI+nMuqU@PKP$p9kBB4{u&#K}WKwK*T z#n{Qjq3mG40Z9$|OR6`cb4_Pc)Q4?X$j!m!mrlFg1xh$#pm)95Zf^sqZ`bHhqqeTL zjNSlfXe%z51oJ9QEyxC&Zm;e>jRz;yXUaxH4zUdeWJs>x^b{rU>?<_r@yno3Lb>nm zD~FL)ohQ$vJWD9rr~X(*qX4NvxLWdsMeG4cj8CH0StY54l-?jrCW*~9XVXOfisX&bUAI!bOVjDI`=Ol&c3eq~RURjrKmH#8c|eB0Kt+bT;RR&a zgC1N|kwFE2z=s>*IC+Y)C<`DR4VWJNBrPijP})@M`q3>59Kp-0?ekYL2$_*_jZaJ& z5vYz7h>0Yqg3B_R=@`WbxB!T?02F|>C0M-I9Gxtn2?UM8qZlHId<$ZAFbEY3t09DC zW!8(t(Ep$XXkCR>pjJHXq6Pn?**rxM*rQ9h>9;_=5MC$+QP>1ED4BEm!I9AgbbSUu zNJK7J9shAx0g_ix(lSpPoO|umeC4u8$}7G4vPtk-$|yUK`N5*~!5{n}#H#`lAVqzA z0IH;dC2%vYv@DISi81xn%M&6*pq3}tf{T0tp@UE+8m+9k3TJ%-c>4o1^n^Y2o^g;_ zx|Fn=1&3+yg;)?&4B5S)wXq?v&eMs85xE8&Nko$10v@@wdrcf4o!U>*g->$V@ieHc zJ-NIBGcbz;zM`bhd6=aTon{-eTcVB$5Z((|fCb=3HoE~Fpsc#Zp>9L4Ad&+`0J<&c zTQ>OHz!fHlJT0xk$a4Sr16PQI#9f8O^-yf}Q03$cav&cRBL-_=qksdh8vp{0MHX}z z5qziwKtMI4%)56=GU*!6tDPu|s#hN+9N5KLW6Pkf^;(5;iqDa+^5|XIJX^~-I~c$K z;hg~DT>ut%0vuRBpjeg>cHUpT1GuQdKd4?c#oh^pp0Q9mXZ;WG6<_kz*2i_+@`YT; z6)|wwI$!7oYe)uO*o13*qZ@Dm8pzH$s0R_@2jep}+fYHH9#M4#YwVWjIsM`@<47dOXZ~z?u;q~K=5r)DNeyN_DgEFCn zLU>R%xPmpcsV4tQRx!lL>iL6T_=FnvlWW!C^3CB9t2!QDLm#e&Uibx;BnD(CVo$>Y zAaDT}xB(hqVkfTAhTGq|!#mn2T|u~F6Uw73zSMaQWAQpRy(;5{GQ7jnRoKjfIS?6- z0;vq%84##|3eb`dP(K|IVLhfZG6j>QAd{znRzD!*{5w`$OjiC|mTVN81h^% zU3M?qU8t3tFE!THv2|lsqLrQ5nGHYz58zT3_<$zNV?E}!F|CPej+XLp3M;f;V>RS8 znU7?B6W#xm;iehqNSFmo$Od#y=SjZg@)a?6?jmrohF?$yZTO^QfCW)FI8QqQ^g{=J z5D|2ZhU4?+e?G@`oEd=zE7oBI!OPl)?yK9q-3Vs62?oOnX4aiat009vA zfDi~_k?s!gsH`_&sSZMEr&vhq6}pygp1~z8MPAvaafL^wgqyAgo#yGe)K(CkOS(i( zawrEvwT4Fuyy`qBbi%P{=nT%-=TX>^BC~4BoW#`Dl~@~SQN=#(3j}}_+p(R_)9JyE z`ow#zotI#1o=E`~pw+kr0Tf_?9$+k@ z8UBPkSZqkR3-6iaYL#q}yyQLoX?DPdK;?x`SQJ-y+^QLBf|=#0;(l*e3yMv? zMf6BqbVXN6CVh0!eDX-&ZED{D7{IZkNde)F02KIv9{}!Bwl*ynbuc|sw?I$@OP*A3 zFk_wWEtE)=)dTN!1x@fdHebV?o>^S?_em~?av+D6^o7T0pHe`CJJ81LJc2-2hO;_$ z(D=sDh=xKRgDRH3A}8|tp25vzQr_qdYWGYgx5xaF357ixP4{*N{{bBsZWRA$vp3^P zFg;KNwcD6#izR3^?>gp zYq)c%_k3m`;zcOGAz%b@T!zySL_#DDa8#>jC?Qe^RlTE3ji(upXZzl0jwPo@E0NMy zt@}Ahf?>(v3DALXZ+W@qd*zi|Dws3pB~xedISgC%W6jO^VEpS*1)~4Qgk#wE$;bTf z?;@rr2X2TU7K@BUp=Y#~fh4$vT40?T5v0{Wk*^0&s10CIqU91yp%r4GOLTOAP@$s5 zi4g`xAQZ7-A;T0YX3Q9pq>2|WVJ=p=*v5;D4Hz&?An{}5$QU0$gkYfq$C5K=mXL`l zbLLE!ckKK*1WAt`KYj=S4Jvdf(V|5gH9AD-5SuM}*s%HYXO^lthh|}N#%>%ru3gE2 z?Fuezxv*xWiXA;i`at7QKS(`I&?i?(MEN#PNs zNRlH#d`PLXNfR=}X(B&E#^#?qhbZ~!smCbw>Oz$UMGCa3o;Ojas&YPylGbtN&!0t` zUTs>mY~8{o#>vp0IdjzDSCb`+A$P(At-%Esf>iQMG>!l$ zAQz12vdl9J!s*y#lt~DootFWVXN9h~f(oCma1y8{h7kWs-yV4&>PKxQ(za-cUd$ju ziyx7ok`6kMqytJU42R=!IxcsH96dI7NFjwB@&`{wvT7Y0RH*u$Dpg%Y$uI1r=hc+! zfm3CbSeDbPmaEXB4l&wT(+etd@xsd{i>Og1I)AMZg@8o}C`c`CO19vf58er3F_jgQ zCor)5nXW3Du&YTVkr;C7p?N6Es75HZF-H;!IV8i3oT_9g3pVO-gQvyqc*Y%aywQe_ z%{hmvszbI~@lZ&r`i4}qI=70gxSpl!u2xzZEL$XJY4Vn?s5471;h2+5GRW{E%OY4{ zQD!~Q0MbPiKNnF15!sGX%eM`NYZH{5{3!A-p65*1l6Oq-APMV#t%7V`~MBN%tLad?M#9L!cCpNHPA zYYAI2<71Vh&9E%bQphaL@>0qocHoQ!D)rR!P0v0@fkel+#Cs~Dd1!rG*B5zFMWiCk07Vr-2r*-fB)Q-M4mdpV#1hkEL521EWg(m0cO$BZ zB2xW9ao-h>nz7&=V?xW}V|kT$lp?cNR?1mw1J0JSv^?7Vr9BkE1`0#i0oXVIgV-R?2g~!p zj8K3B<=8v!zv(Q3y^`seO!ssSJsoIaR_UE zlDl92vakq6sKI}oGlVz>xQ$V)fpn!ypaOf)0|kDD5rScz1Glw|H`d8c<~rB8ET{@v z&?0K=s#@+k*gM<6CJ94;0oX(UwhnLr3bsMs@?`V_5P;x?(-Xqv;t*9~#KS2OEMEB)$*45HSC+#q_?tx=vY>`YKr4%CP{cC2=tVI8taJzz z8WGHBMg<~sXsKJ%8gHQsJ53N6y{P}=(_EoPcUetdyX##Qk}!i3av+=?NQelAFo#8v zt&u*^fd@d~0w1Ihp4OY24R5$TIou(icj#pJKuI0!2n8yt(t}i15uQA#f)YneC6vYy ztR?o!J+Bm2ufSmqRp8GRi;Bc1yr&^ppyL_a7@(PeDa>ICjhJOTV=--D1C|m&b!rlX zBSx_q&5)u(I;9=d0wpzg5o!;6=#Uqnu!C>1XanI~>NrOrsU&!zcT`Z}3Vi@cl|1ix zKB(mNMl{MdjOq?9QP@7g=g)r=s`VZi*~p#SLOjn5_RRPiS~*c_Os}$)ZvOb z$fgi;F@%Pefeu|fgQV~9i_ia%;MmhaHkrsYCS@s`Ofg_q42;+;XE__F4QWWIL=_=K zShQ3Qj8g=NOsyfIU>`?qfvUb?;W|NJsk1##hBLGw-SjzDvLb?@Jv^(Co-$CjBFbZ{ zz*XW@3B|%KnG$HBMe7y z!LcYMV=^miUt_w|r8Tg@X!_gV(f}C1Eg;BhRJ&9Wj9|bc=)gD$IfE)}(>6~~CvAmu zsoN4~37wngZ^b&+eDagHLjmZ;qOw*(XhIc-AR;A}+Z82ZH^xx(m36O+U6pN@yR&k~ zU*{lHRrCTGsOW{6YC8YY_I|@1-|&kdt_9hkm2tB7wQqj&JDL}~Km}Mv&1ncy5Y-%n z!5tXE2~Oiw4iFEjyW`zOk|5jJ(zcxdGuw?mm7L$&1Sd)vu856-9pkPF#VTeoD?kS0 zy4pC2YjLRjY|OY|<(M1V*s&|}P{Ztr7ZuCE$C&_;-o+&78^ZX@7@w@tDc`rs{H+0& zTb*SttKbB(mbGdUGUhT1B!45Lg20v`Gn=pV;jC{a^W3!+F?Ti7lRbntZ*W|+= z{(~a++-D-KD$ptBpvMaR;lww@b?B;mVs&Gdy@=ygD&S4g!PzFAP0SG`i zLKvV{%sbe-K>^2%C6ortY=N@0wcK0EpX~MhY;1-02@)lgTai> zhN&2VpaK-2fCrjgFi+jtCi*1kA*_Av>SUXsg66g-yv)75M(v0I)%W1|tum_@&Tv@A`r!pOh?gbBff;z= zoU_?o6?Bt=j-w6a9uRp0D)0ekA1vA)URaW--Eud7;(r+Go2ZOl(k-EuYVmi4hJ(i zBmQMX&LIB`h*~?MpdcxPxWH2CL;(mq-~kFafaEbaIm$ydPbxG_Dsynoo)F z)8UCywoOFEGyXhv75}(@WnH~SPFRxGMvg7t?u+AN(5W-LRLEwp4QncJ5XdfZ4TqA7TA7}#jecSknMbDXx zm8f6PX%{%KU!>`nCd9=aq==72f+$QwJ>bK%n1KPU!5UOTGz4Ir$cgJ%MrPasX9xl# ze1`uLa9!8I9@xzq#MK@Q?7$8{K~(MDY)l^%fKvym(<6C+1$aORga8OITMWz@3*f-> zDPkC~p!CfF4+-9NWM3n!imDJoBYc7?6oLi^uivb zof{ZJB)GypSRnyrVg5zI8Z^+GL`Iw-P3)M9F7!e$!U8H>NFZdE6NpA>sDNp3nb?I5 zA;ADd48ah@hDN*=@8ruI=pjOclfSIcBUwN=S^x@giXmDG4r~=YWx?~+6DF+{4GJDo zAVszf*S5_8)p+7uncH(oo?hh@69S}mX#*-~f+~i|9vDJF;sfZ^A7F^lfFRbtggc8!Bxkzzms9YKD> zD%!^$Ou{tq13wH9IuuYa%~V9r$(>ZBGzsHQJq;>gkkm{g-icM2IFt8 zWi?sTHDME>=*~9XC0^Q-UP8g}^rZ-RW3jP-1ylfaDw~|)fMTA_!E~5Dd1sOcNp)Ce zkz}7{ZYJR6#37`ZA^gE7u!1L)rc+9nQ=VHAMjC3S=4!TPee6LXD1$oys5{Um=-8hD z{R|hJ&gwW5Zz{taRme2$R4}?i1^o#z&PoOqr#4}ua&`@E)XN4+;Moa5BY|T$5@rd4 zfDWvaV!lnZEys8AL{ALGc(%$7n&){+MazYPD?~yYM1se#4=6%qRN5z13S@q=ra^jv z8u(bDaDp$b*V2U%ZbDg12}Wj^OGako>`W+6@d+`yrR`{thBnIYkjVe9g+X&lprpt^ z6>LGV31&DN--%);Z7pWrfeKkIOpMB4pD6_n-l)vw=pXE8kNzkna07kPr@382YC08C-yTNY5n^cjLOsMi3U$!$i#sku~4jR7M#!e-opmR68XrHfl$D25J-anhyMIEtB8 zgz&7X2t0&Etmth0z#jr)2^ybGz7q?%4W1^4KFPru2v?sH7Y-uDjqXHFm6v)6A+Y7 z#2`=vC95a}W;!b*P(mdx#UX^kEL3ZYVe6ufA~!TD6cs7Brkg8Ffjm8oA8F{njtFc75=1D3QlVMx<=*t=!Bi<` z+Wg_KHtb254LU}w^~6w3#Dv219UDBs8)$3{(x{QNT*zwXpmt^^M#3DZY&Nj0xoy`q z>>Pf|?9A5eDq4iOBIG1Yf+{G3VF+kqFc}vpkkA|x!mS~z`Ii!8mWFKBg`ff_gf50o z0#ME6?f_O8P;EC2!3@ZNLoCE;Wo<&BUB=D960E4&K+^x*wbKQF0P%f*@tK_2autW+ z*<`K?7`$!V%I%EKEl~WaPB<$iP(o(%P~NISwH|6U{4I9nShu=t;YON%UIXH$-QsdW zF^mggB*-;r!!p2Em97*6HsA{wEk}w0Xa$0ybO@ppRTZ>uX>lV%Fof($K+gr+#v3pq z3%0=)P(cS{tWfv_2zxB_g6#C3FyLLHwPtVTc}z77X>>UyH)x6YrdtndLivV?D^3C| z>;qVCLrz8HV*uba=t7evv3@Zz6E`ER6-4cEu}3Tf7JozmpVmWE!6W*F#>qhPus{Qw zaXX<|R}No2HSfw72Hx`0lVa6hnQS>m(FIJ@7+FZNqJVT?{pxu2t#k(nkO@dbVv)AR6K&Uu0pjI0xfugG$fk$Ix-IT!X&`7Oa}sy zedRZ#*B5=p7{CHBpd|&N;TSA2Q9IyKM<60yu~Or+QZK|qOoaB_rHXu$>ykjP(&QO; zH4D7c^RTF={FWS84;XC0g#Cb8XSDxN)~Jno^jv4cNCVyq_vl`Kf;5aGH*<4fZ`U#m zc42qO&hDZE`RsqB&KL*+ma1=qTI5bKf-yP)fU#i%&U3Aq-DY=o7CUtp%K$a{+GuZt z@I=H6kiZ0>HcbNJE^|t-3hSMs+*r-_7u0sz;C3JEjWRED3D5OMYfP%3uqdd)B(%X^ z_w`?UZ+0cOa&v<+ymU+#6%^!wP%#22)WQ(MS9LQ2Ed1sit))&~h&zixWjC?xJzQTV z^?BnnLl6&pGYVdMQ$#c;31Gl|hwa#g06DTYZTY~&w&+-m3LAg{8vyt^Z9yNn?HdGI z#oQoVXJ+*_^OlP=v_k77XafI)OZYL!Fp;h_hF4y)@Gv+BPezz4BNWXn)?i0Z(? zEd--QS|mnlX)$Vu7$74v&hwYi_-2202g*PaQ0nhICLV4aLj*_v%m zN^JBLhf6d$7>N28T!BSXImXHy-$ZY3Cpa`Sc&f0=aMJ=M7{i$ZE%G zgCPV@MVu>5jW|AVnjjpgfQ0xh@VV^x`JU_)m=>jH+vrccT zS1&X-f>eA@yF~b`*ZTjEo~D|+v?%yGu-D;p6T1~&;V6&}f@TYrs`#_pE7SUvCTvKD z!~sdp;WSFbUNCw+fqNX!28d=Y+CgD%1bGEOk_e`;2)=v77O$wYfp=`dyd9AHE{i4D+7lMdw+&_da-L33KQz!VrG=f zZ<;Dw_KCj2Wn3DH|60V$11zKuf!T#k64YgGYyfq7z|ISPLp$_JL{ALO_8dF;&=dU= zBmN#>&gY>g9xKvQRCQM&2(E6GCBVebwBXd311H&YIeIT6Vxds9%kisZ@ zL#CnwVEoK54Nd=u10#yh4%?$@g^sSEly2_Ki`v=!%MSs$A6PkgL0#^EZhXKQhhPXA zIh}MYpTEcwl+;Uwm}>$C{=(;@x#%nR zu9rU7e|-=ugX$}8c_{-xEEBZs+q-)8gbC^r1xdpqL?CkEB8XJ4Ua(+YgyqT=DpVag zdE_*blcq?K3>Dgwhh-a=ZNkKqIg@71Dnnp!(8)mr&lz4==9x2N!-fzQJb+-alqpjk zPoFlC`sB%yGgR1QWdnxI7q45cJn^C9$Co~Jp6DS&$j@50Z{e;zG#64`yLTz&rIaa? zUP^lYH2VKD_)jEFn%d-{<>?nWaNHhqlRTMnWy_VVW!9Wo88A)Clm&9*#f_m!uMS(CZVBtvGT*s!yw2oW=& zB(IVp#gGslz$D2wbeZmhYi!U-v~2DD;63vDzv0^vj)e(KSM5mL0d=9_Jz5rj4* zY`d+88EqJ2H%5XRZa9;S+he6UTxw3pFsjI62pOa+YA2q2f?`3IyqH0TA*x^jJP$r# z$_M`(eCTpZ9B@Eysx#!s%02eB`T{H_e)wSvKkQSBtvUH~YcBs9$umF!{n|?}zz!LV zkis-sg{4_Ou>~9nG0f1i3o+D88EZHMO|&`om_(U+NW6v-Ms8W=nQNjEh>M0`gb24D zY_Oq*S8Gs03^4+!^;6uWC=LZ{NE@J~s)8vrhi*Y~+wU^#ribJ`Ef!P{UUFBM(&)U6j#CDQxu7 z&6Ls9Lrgij<{ftq)`eDBZc#?mT3jq5)!b-w^@WRHP(g(qcyMCYT0<;pl0XbGgjfF{ zmy-$FV1vy<2pNbiwkTtJLKY~Ygle`(XjuT^gP*fxflD8RSi*-TkWQM+GQIuQOf{cq z^NMosqw`$3(q;EQyC~t4&%XZrBTxhnvlriB7M(C{fBoHz(hfx<&5groDM%Pb#t?%M zjFwqO7e`LDZAMlt##rOS5$A!2S>0&7@j1Mh19F+Ns62`1W{6JanK>`Yx}LfV2Xf7|`rJG5WEZbYxb`#bvHwsc zl20`8hpfD?QUI11Ye1HNJgaCHd zdI}DzLOUv;X?JX>!wFG%!uPOg3sh4}Tdww&tZnUhc^ zt9#n(m!v?WjPHd{e5B#TKJf94QVC)VL||Y0dZ7zaP?3K2%UJ#pcLFh!P8%_@tLi;_yI&`9vfP)rM6R3W!16%n{v|O3rL(65#&}gco4xhCMuk zANY7iG_*mAD%uD~AHfJLP$32-)X$4w1f#~rSVl9VF^vm6;4|5%KnAXnjSqyDOY*}K z=wuEGd5j6RzVwtEh)INmEMy@SX~-*t<#%m@cj(JQmDsu$Z z>A+5k0?lc22$(wJL?FcA1dxUle`GXc2TrOJXG*hk(wwFoodvBhyabzbFda;j085%|37qB8 z!I*-INHuxoJz((cdxpBEcD@NMa$+j+?6S44t@fUNp=u7BcU4eoRTZn?swoMI%2XCn ztYbZmS>>h-eykM`ju3`8q7gs&jX@B%xCJUWF$w8P7i4&K0u*+zgBI{LnIix!N>%zy zXBOpwQ+k$6V8YloFbf7EfT?7I6_X)=37k~HZ0!j7S^a)C4V(q-7ue~}KImboF~rj$ zQtP$4NL7jzj1Y&|J>I%)tf0{ZEP(&(g+P2`xZ41PAZkG>T}UJ% zbcL>TOBQ28fNWNI-D?=TThhQ%Go=ia;|!=2-lbihTh5`@oPLM!w@>a{>2E+Cbgg8l7+wf0T-1b671Z#!w ztf8?^h5P;BzHUu(;+Yo^Z8U^MgWE|-kSJw@C)h;q~T(g#v_klv7 z!n1_j93roG24@@skbu=J8PI^f+M=>lu99W_mXLPD5?<|Jm;C&t4v}setRi5a6+Q^hz20c0Equ(9J&^aAcAcoLXo;gSGu~2G|487 z*I8W`yV=bgObI9hAvg=vEc;brD0s%7 zF@nf$+E>@ZV7z3Imb7U!;d3AD!3~hJAj_bY1wF1T)Izf98QrU_lo1IAG?0OLpaSbH z$l5)$cA96mAQm5h!QrNb_?{R{alP~<6Bb91VG6PFj(;5FB4;+qPh$;~?|~EFIEXOJ z(1kUiI7QD81Q%>RBj#!}I6*JBq~ENoq5uB~)k9jD({0+`Gs2(>iJ5v8tTO}43cTQ4 z_j*=NXu_?8y-Qyp#2c<)c67}%;tPJ4+WE3zHVpgCg$M)3DdF+1TBGiE2N;Ka3kz%b zIljO+$hEt$5K@dv8!P_yLk6b=UT$?YP5)Pv{ z#?MET!&g*B$e2!#h$IUzCrR2*S(N`{CXUQHhJXr|z?|+6|MJUr*aP8cE%n|*EZzk6 zWN$ypY)=-fwfF*T@&b7vVFGtZ6ymNBXdweH453190|91II&2b9Vfp5uo4mjfo&h!- zA^HSw6b=p11OXxj=LKIyR>WWo0)Y{T;|6(dSAN9&Xu=1PZdhc7Cq9Ssf?_$I&eW*D zoIo)Y^Xsz|>A%kDE5IT?9_jV2pbvPh_5_4$fX%hM28Raa?a;6d)Q}RS;le=f4dE~j zNiJYeK^rE)=<+}hzX2U;!4KB}5M*xVbYTz+k#KCleqP06Xl1&*FC{in5-G7ro`Zlk zr-Ae>g7Ux*f}{#G&l5#4zd---vk(ci{_DRMiIE(sO}-!z3a}3lkPBf^!K6wI#jp(7 z%*`Sp7u66Fj-h+%uJ|+q7{O{9oNXBC&=^O9G+^Nyu3;Mh&kxO@7I5hq{ALVnU~pQc zRf_2aYCr{ErN%&}WD4OMZGvS?CpuWFb96!khG4N6E8j3N^k%@*J`ohT>?rdO46w|z z4lYgf3l*v2cN(rAU(pL~4-CPE?ecUJjDh%m5#-cz8gkQZLT)#w0W^Yh7=4QqwBapDgAtaIBd=i;)*uQ_uom$08A$RL zsPP)@hp)m&1^6d`ZfbyFfLIC(nsSmSBS>;yLJfwXW`goMW`G0m%bcW;>zFd(P|r+A zGwdA62dE&-4DcUi2(`R0%?5SRm7_MRF`o=`Ypa!thn6y)WRA8BU;*G+Kfefp29td?73uWfOrk3Q4 z{zs0&Kq(0cG_xTL%TCXPm@)vxj_e9>3*lle2;q|4CD`6YEhveS2q7Q<03rDV1QGxM z04x9i008;`OaTB0{{RVjBE)9Uqf^F=HA~2_p~Hs^he^yuF_=Y*6f;s})hCy&M_*!y z6shBf$&){Hs9ecX$H2dSwcdKuC}HAzBjM1VR?uXD_&f#9J|Ml8%wUns&OzvMojW#^2Dgq&!4G)-U7y{($il^gZaWn zDHt$pV1w~m=S|l)xZmjM(?`#4-oSbLAw(#V@#4lGp;g}Kk@B>6+g{2<-IMj}*s*`w zzCD%qRII{({}=CF)GAh~R;^0ED%LE$;lk~mMNFdo`}TeP`elEA{`~;@BA|fx`JxwJ zenB(Xf`A$3;5>^(D9>Ywu_IYy)}&$?Ay+VQg;jbCcgP`)G=f%%CgK$rC3vOCA|#Z= zNC_s_QQ}E;)Kzy~D%oZC33%4=_}!4>g=gfEti-~Kda*R=iI2@QT^3do-?WJ&~}f5UWn-+`GVX$)ZYFi4nTcOE98gpgU-7(3x;SWYmI zaMed5FnaO{dElYv9g>iO_vnz2hIgKNmtq=Adrx-Sq%E=7G9{LzUNlTFY1)_2Fbf$2 z&8y8U|McptwAN}Xt;F044K`rTS6`|U8Q3P8{oThVf59Rv5uB;mGUq+^L>pM0f<36` zo{O9ZomZR0DOv zP*+nhHdbG)_10W>{qWTgFHDWZ6_;J>#bM4eW||=b>oKrhY8>Y-bLzA5$}GG5@|`f# z|6FsQ;G_bMJm8YMq%G3O^B}hBY&-POMK=acI7uTtxzkN|qq*kTSd+Eapm)9S!_+`i zy6I-8J}cT8ug$TsskZH=eHwex>@fG(9qsPByX?DzerHSJIjn?3xFinu&5FD{`v z&aV`;CB|ZM+&1jy=co2CeZ_)1-YWCnvflGF zKeOL`5?{^nHcF2%*ikL#Jr8>75SnACC%MWc4SP!K#?v+zweN9FU(g`itXf5;U|h+A zRl)@>L=`GeHEAqHYElYg!K=OC!gaB0-|GxCruYS89=oHTwCvO%17fRB@+b!@|F9ts zW27PzJ_|-U^7p%IJ&zp;gv`^AHlZoln5iWN@UM9XoGF*UBhJfr3nuGS&G*Y8v2}e`( zNIG(HPI3q#u0i;65WevZSimxsr69#KPxwPK!t}!Sy{&x&TGlX(VY@@lLw9wupJ1rv z$e2NLLP2~*;-FC$o_z{bpbC|gM8!@|sV7P8iRY$_^v+7zlSo5~V;nu9{}vi~!Y+7G z4sm!XOg3=Epi@b2m#a)sVFX{Rm&w* z+ap_E=M?BY1uN96UVEkyjc1H+eADS9blO6MBP11;&^3&U?L~fW^C+@FTA%?5NTkF# z;(dP$Tx{-exWxUTw!kSyc__CISBOd-`oP_^sD-?#{myo5_oFvHiWRRtu`Jyio><8D z6`>+wsPHRB4_c&3H?HxiP$k1Zf-zP=1~N1h;yN%AVev zP?e*>c!O5&@YhHm((Ez2z=b@p!3sjuK@a2N*^z8vDNMEa|D5b(=YCCfsx-liAwz~$ ztZuch4DO4ITm)ai08QvZLkxrDD;w*W9AH4o&cFkzQi3xPs&hD4xX^;|gW|zbKCvSh zwvY#99w9ECfd_F>OSP)4=DBKELus#Wn)NCNrc6?<)(?!}1UJWPRTnJP796z0z$Z4- zoi5S3T6B|ZTVOK{E7Awv#iW}Aj!XAWk@|BaBtLD7d356yW-)b=q_I*b@>P0}Guk<3 z&2FS&j@R15ngvJqHLjJe*vL+{e;LheHRTqhkk*o3svL`I2Un5U?ji8z!D&dAV;HfR zM>xRUi1D(*7SLdx@A_t~FH0|S=Lq?_*-bfHYi?=q|IS+Xwn&XZw_MmRhgj+FH)P7O~(TZ(%O%8fr zWQ$b?LmI-i$61YO6py3YSW8>NQMH*cFKRJiie1sY-@5Jje#``Ip*JHIey_&S1^-}Z zG12ggPyFH|Bn?)`;~bK|M6<%dL@rn8rBVbv|LC{=K<=6TYN&UWLq>U#VBpv7Cq!fH zR~#PN*E09k`7n*%LKi&7MVHR;2t;L8dcah2pcPSdQCGkQ{k0diuyZ>m5j?gFzfdLm zVSyqgbPyLOuYe8K#(V{oZ4HNb5>kEFXA6+f2$ZIN2{A9B1TP)aeqw}Us1#>5NJ6$? zF7yQ|^M@oV<|yfP3b)5krd5OhwHyK{fMw-Neb5!fbWBqK6c7~@MiGTXA%#M51s0_T z4Y&&r7)Z#%V?0JX6lj6bRwWylM%3_ug2y*qwrMlNc!)7!*pLbqf`VwqGu9CbEXHDN z6eNnm9pUi_sf8DIAzF7~A_7PVy%9`J|5#aAaTT8N8I!0`4OLM?VTD&XRT-95sNq#! z0bOCG2TMpCdt@-dpmXfwZxYyw_>p75M=HdCe5oK#Y>05fm2FG6C*6<==THu_z#$gp z6tEE+u;Ck*g@BO=iD>{?rtun15mk(}P@b4om1vE}RE=EK6i?+<-dGi)2o_6tR>eUG z0SF1tfsS?Y7X9Q;J@Oqa6eeF7U})%yW0-*=)pPnKX$T@t^}~GEMi>g$P0`nB><~ET zzz(}W2uz?7C&3vNg;SeCVn$#{{;2v(z5fYrqt*kv5a0b1WR7i}S4|KyI>p?l_4 zdnPt1vlJfkcSfJ`DOIve;UEp5|HfWGv6CXG^k4}~@cL$59LMlONNW*YV(Lz6X#Z7y2CrPQ4inkcx z@Cn94D6O$!#i55`sVJck3M|=1eHfap@Lux;mvJdVxqu5f)_!C7E();_Xh(BjB%3pr zmwSeGN>&ax$z-i*Ec<~fr6hE#nU6vzaBYHP`4~TkxtO@fHv`FOn--Z75;)Z`4}?;H zgFr5xzzP=u5e?A{&H$d_|LJF_SDxm1o?Rpjh88|zM-5i9YQ8pa>nS$siF&W%MP`$i zXA=&(`CmIpCdk4jr=nlF#d=s`pgmVjyI@iPxn(`1i%2P*l9>wC84Q>pF3Pc;u|N$% zGlz3XA&J+aQiN{l@OdJ4q9Mn1lY=x81aB@XHJTGO=4Ul82R1ENXxPwa>X~n|A`QIK zpG@|jse&#ZWT334fmb4MKnX6NU`@=~oC2wIg)w~+I)|(v4fik%m_QtA77NXgNZ4i% zQkoc>=Q!y07$};eDk?#w=b|wRpXXPj^cFsW2588ppRY1Hx=9T|x-rDriZhsxRw8s5 zNSI7|Nb%61i_|hw|H^RDCx;XA3Md0E<`_RRg-wh3e2xUESa+srs-j8bqPym%GCDQh zQ=>7rFgsc+v7!*>)0(_O4XG%kX)=bxxswMPrsQ`tp*J}abTr=3qS|Assft0Kgm#13dLv|m@f9hPA|7fq4B^11 zv2b@`BvN8nfi@;aZvvD87j3)sBTd4fzbY-4C#8?tQV)0!(BKJ;u$@YTWy|NU5DKl4 z(HOtTZoQUjs+yk85S|YqffymKbs&tRaQpFk!_n=&A)(rhKYj8R?>Delx#9sqC zpkXGL?DUpz>6Y?mPp8l*LMVi;6|(u)j&^}Z&hbm62uuYSic*1%NKq737===Zi4S!K zPp}2JpfE2hLxQ=J_o`pBP=N{N3F={K{mMHIB7%n(ec5s@`k-8G)hzWTV4aC-%>t5q466y4~Jk@yGw#jZjc zm^M~t7crzC zz+M=$8ryz5#+p(~sQPtC4~$|)r@X;RkQXe6!|)0kd7x zqDESKMs68r<0>i|Q4vgxDy#CH3=x|_Hk-D|%R%;5mIgRZ#5tT}^XNQ0YqjIa$M&-2VhaM}&t(9)nvt<)-V=>QID|N7G4 z(9)U%4sIHwr5B%CqiTSrp6N-R0bMpe+6`8uyU1)G?ObCv#+nFPq%^n-5e*HtK+#@$ zH`uJGZrHpWU48Qa4zECJ<3g6K;0%dsEnFtF8y&FI7Y}Fp80o+c=}^~pU7|Eyt=5yR zN258}+G`Xvqgw-P^GP=6Y19Ri)Ikb^39ZDA?bHl?cMok5s~~BTCns7>!4+)50jqdm z4GydjZkV86!4MCXyk*P_eOG*VXIj^Eeb*^k)1aEII8CZ=n$N!$r-WwMMD48`)XR7p zs|TIT3SHca3__&jLGB@Kvk)ipqcXS1e3#74@zBZf01hZv)~tXF2G^`>|E=0>&A4&> z+IKzE(+a93chfBWqHl^d`)r=Rta`7=n(sG4Bb2qGG8SICt`J8z?yAhi4d6D0EFa`S z4onQqZAigD#k(`znY?)3zzTGYf@)?9$`{?3Hjq;aozThIR4O#EE!%y)YpX_|`qB*g zaVw4#jFX7mj5}*W}R$;xlbI*;>!4x-Tjo5edklQjRtUSWi|e?46kEVTfPPn7=Vi{RH6u1+BfEzQGeWZe7l0sXmAnM&PS}jwI90T6g>rj^ z6NT$R(d$f+6rb3_pg2stv0=fnS$$B$j}Q#?3~_(;iUQ8W#~!H7jND>$F2+zYh7@ra zj&L|c?Ew4W5nc`PKqzkO6jY^*UUgNR7?Go)g_tP95)~9N|G&DNNR6LpyWvRi1;1J2 z7?L=gj-f@etL{&2)C~2UiVbh8#$DVDEW9E`z`KiwD}&Fb~G? z2veXFKVSq@So5jtjN6FwS@9JbsaZT75CI zo6c~a=o#ksX`g1Nqxv#BNDU4@8%NFCRmQ z5$8>$SaD)JjPo#V#CWciF?+@!>8YcK5Tr|E0FjwK6Cn%Jh;x}7_R zEm$mE#(oZ?3)HUNUAyY;3Q92V-(YzK68x1ZQ!G~C^exo4*j_%z5a}(XH`$)WdGspA zyT}n^I$I!(VH#u-5++ZljDbscF5PR`v1P|*{}-EWy4tN@vt`#i_w3i;gr5^$-1u?f z-oSZd&b(XmZqc7tiw?EwRjgmNhi!V6Y*T1v&r(y%mfA45#^|oEdpB_3_rv`1oewx~ zwO9m=r8>;2TVuu;iYy{~Dl2d@%qZeaBhTVtXCQr?!Gw@OAn`<{VdU9oKmrNOtU!wz z+=w0Cd^6F++1O$WITn*^4m#;#tm?X}yuzj{^0d>DJ8Hx`3ma_0Ip@4s^dg8o`P`dJ z$-kOxGMxN^A%;K1suZ1tThm_~#<#JeM>mY_?sN>0lGiq5CIX81{Dwy1m)%Z2fpXJzUN#g?&p5)&!@>31E&!OB{a0PRNY`@zcj9*gWv%M zw5jD#PUvay&s#L_okd3DXGOP7{nGMoGke7uR&p|oki!bUgxw41zhZWXq*Dv@Dx_0? z)xK!@>P~)e<#g%%dp}m6o^EJoJHc1lP!P{PFhnZ!r!T~pn-DYXT}!rxCEjG+lOvO! zG3ZWG`z2yftQORx?|IwY-rMdk^L;cv-($AWasVf*2z>Hlu!#eP zu)E#i6)IFG_EIb9CSJz|>v2>Bi#6u>3eB7nK9N7mbv=5ReIplLu zvhn!O+tl18vzPp4Fl+5 z5z9x-#4pb-A4690)JmIZlf|(2-;9yG*AP(dk|0C}Y_}{`?XfAfKy%j3;ByOaglEvB5<*OSaa8V}N*hfxTcwg=V9 zeqgciy$VZLiMzv2z0#tx9w#wL0_~PYD05R+vIM^iv#^by`(o<|4F7{8Z(9j4TYeJp zUEv4!M&RKL;zqJ`SNnS8Nkgv3-(M5n9tl5RVmzMw$&(?FTUDRW9`bW($$9)yF!e}O zxA{8mo~UVgF#`jBDueB75 zQb%-%uh8LE(d>N)xPi_hMY6Jn1b8A`FEfgdT~_&>ARpbspB!fZWv!z;>Bq)i9t_#x z#N(2NNCREI)ueDe&4p5q3(D-P4Bcwr{0GD1l7*-+*+h425>rXUst)IL$=KK{ulMxn zapmdVzJ(qLCrp$fcRCzB`;Bg?jDwd(JKiADn0`raZR@5$j7~+qQ?~) zG|n^nFbgLkMR0U2%hmUUbVx$HI zsJumDl`jJV8NTUA!g%|fzc<@Uf87~bIkiZ0H7NJj88euxY_kH4`nT;cvJ~J2ECR#~ zBY;RZ|GoBz14HSiG@)CK8#iN@O-wtQFG69C)Kd|JTc!7yObB&J0 zAlh&gq|gc2M7ZuXJoJX2yfQOc0l*aoz0eE~qtT2x55-*$Ohb+t-hz8Y^j>9EEbdeJ znAmD)@g;s7Ammh<$4Xv^-|_lEkLp-H(HtG6#L{7trs{)l&xg)%*oc3Kw-(~R`O8F6 z<0#(_fsTCAI_U<3$`k>qsVxC$?ZBWY!+hL308`C9o>c%$hGl@3)i2r4--X`GGE-0~ znB$Jcmxk3H(KJ4}^!uS3^+#7C;^=1ohYG*kymAsq?`49p{!?+&iv;ef$7SZ^{U-*L{ms9e1z}&DD7xF$W(qh`DDwZ<%7&UBUJ@s(Br^{%L}5f%#== zpRlVOtt7-|zWTX-%T4IJWYT=kZrlfPZu}eVY5|sGtcm9^K1uZ>8~ksrRLG50;HKPz zw}jJsN$#9jm;?qm_L>Bd!r6Ym`|SNcFrEhKp5%+DR%%EL4H4p!-eo)&U04Y1{CVN? zZ`ix?JfYbQWP*9fS{8lvAN;0}iF=}LU(`rTrQ&U&@Mg7)%#UR*Eksjy$}rL^&Y_)X z!M(_64&+A=5{^xLX8e_f_Tl2kuC_Lpu5Wjhm)cI@9i~lKUIz%5+#1gmDPF zj>kVpuM6>d$glc&yXxlJJNsvmnxnG{w=1=hnkfFT_A%FDGi%wnwGqhlo@^bM$@#JU>9TR z;KOF6--6^;X+68)S48El^u$)DW!AaSOs&x-^3>jLY?}3v{eJy2ML6I{va;=qJ5_kV z1Z(mAK&4iuiExVO8-HZa&{A3VeCqFei@IGzE`&`>w?L>c+_oI9Ius@jijV!vv?^zT zRI64kw8B#`pYTric0@D>Owxfg`>@fuyOVrL)AqWgm&wt|9`ooh_TeNc1QW9%&))W@ znmtMi`xCbz_tx)G6QsS%zqgAiT9#5q`>6+zx&1vwF%F6az!$XPK>#>bgSjfoD(*i! zEYZ&3l~o$|KJTkkF=mrV!5`fmUGaiqaz(;MQR3ksGbHWI&xW{kxqkOTp()tqDy1h1 z)mG3+JXE`yd#4Gv=9j$)7v>3H7H2EVm-K;?8<041^IkX<%Ww7) zzD)~zGpK&>Yhy6czG2+=EJ}8#S^X(RAIFI{2!#V<09+k?_b$5&qj*FuOD#C{L@T7qRfPGUw-ypxdfqm#H-_TPr-Tj%HdgZbOW!;D%sm-2lFe?DaiVIQD z57qc^$bTbYZ^)rp#L-dy{gg;b0!LO=&6`hk1T=^*j@-d0k z&Y?KQx>qrJP-=+j(P~mtnL$!GVhR^69*4g-4SYEaq9fD(N&&1_lVVvF+w*8+sBPP~ z8ahbS3Zw#3Vx{_>H1Zj7`6f8Sa$TcVT?!Grv;jCR-(-07MO(LcrkdzJZ*9**a%VWy z*FN{}NbM`HN-O?BphhvKn5gbpY#S8g|Hr5?l;r3qsWz;bk`_CO8c;BJDZW6sk`5;e zB$r}A%WinI?f2l{`Rmd#)-d{OldJ%w#3p7k;Jd`8En4tpeCVwPvs(v=IX7tQIfF>1J3 zGXfO}K;K*a2myXq_9CR1EZJZfG2m1tlaxj&&r5B04fOm2R+G=aT9*T&Th&{7fSm0k zh<3nkhH799?qH^kVQz-WMt5hgrR#F!dbP9HO?@Ao`mr(99}W1Bh!eyk5{_z&z~=pUEAoY& zsIV!k^i7E&bm(b@cKYRj=7`cx()cruw*}&({eA$w6YcK`vp^IeWY&V|)+|>!?r5LP z6RBpLNyqn|?qSm#)0u{l$^XpHi!41eL^*WAifO_7uP||A4nLcv8H}6!%s(f>ys^ZH z1teM~+2joDoDG&36lN;3de=8Xi&Vu|muGgU=Ja;`Pyk#7cn)<-%yZ7RaW0$c)LC#Q z+j7~A`abXD=~ETTCEZMacJ~*wY$WAiuz}a=-CZQ(J?c(}OX(=*j~yh)V}Rse);enp z(Rnh~4>X{3V2Kz?T5c(`ii`DUWq$n=Y_Uo-jZZU+dLszK~2VbsFMtx4StY9A!T?L9_Q;~wO zLtcQ5?^P?nITWNekG822zm84x_kSAb>=%=dalx@U;a)eK49A7)B-@*-A4iv~K|CzT zJ#ewp-^%I5rF<@RLN0Kb9IZJcZEe5Q11?NiHJn&~0T#w|DS`k@dVuy{_W6BNY1AuR zT&{%|7U+dhyn9budcj+^Qjt-Pj57`;R(B=VB5@2s8yoX;wdh;t@b~-6ZsFvInp{ri zDxW$ke^Sen`_;|Ur&IgJhN=*sofn7TVsEvVL^_TWZ`;Sc?%MZTy5rKp$b?~!s^9sE zV+;VW8e^Cq+j3+tt$Z7YbAL4i|0jNmyAl;CjsL@OY$$l5s&^p^Qnh_~Urz70tRAE7 znsC6H`L~sRbH%rfX}?F?$?o$@&AD@bUz7V8y{G~~@kzSnx@mP7*Dso*7;9kR-CfbL zZGXQoTLVD$76;Z+w8emgTdR=4?$+mq?b%E1_g7_8Fd6+zhcm#72p$#JqTlXCCr#*x zOOS2;q&*?JW#KD9$ixQehwBZ*`Kz>qVTp_D{E7?U z%_uTmW7+K*^?!3-&t}%GO*cJkEI{zhgPQgJ8bF`?l!Pt7_WQ!hx?@Z444AV%N8hf@9YDlQBI0THG@;^NIy3_TduzI< zRDrnY;J8@ZohTj^VO6-)=2xjZlzmuvU4ZNM{ku+|=eEOdTI5=FK!Q4;G5}N8P3U)1 z*uQOi8i$O(+SE7zv=}EHj;-0MaNQHZ99NATh~u^2Fg+o<50bw)i+_ARJ2ScioQ3&@ zlb6J4ihr6e9dn1+xTP5Q1Y&lzuwp_%`KFFDTb!f5e)WaWy`7}(a8q3P6V)Em%|3Yx z|7?rLryeVRKYxK>iDKlEWrPETynqtHyB{E_UW^&v{9PS0pvTh_Rg4Wnjdp|Fb+)7 z3ZX6|pciz~6vi9bTm4(xm^XGs>+e3h7(ZC~&NMpC)aT8beUR5T1yu^Hv>nB5O>xbR zLuClgDsn3Cr3JV`E}2vQ-hn*E2Rw0?04g6&M6S7DsiHRm%-W-IvgYYIhvdKM->2x9 z3BCDs>JMmakt>it_={vf<-*cTe84)cj<+1VC;Aw4P$zl>prmcvjW&#U zwNPm~%k??CC&t6CfHUPPq8*IUaUFop0QEXwC5wV`g??jAgNu(biOJvvyKxegd*rxM@gFv&1J zBf6d0SL!~N`ru_Y%eoML@vmcxi8oh# zaLButY*+6;T!8ER#y8`_cD68dpwLcjMt=vMTe=BwHD5IZ=+`sPm+wHPvKJqVu0DESEDvOaH$EOZ z`sQqIV*`nM4EjkYf&GE(iKf_<^&gbs?hL0FYa)Z3 znOV`muE-*_-HXP+FI_YxcOIVqk@Ua%_oXkMVZd!#m;Zx(?iSL?$>(Z297Q%vh{=VfomlMyN5h>=+ekW6UD z25RQTtpk+U4(SucZaLy%%qo*8GL6L@>lBN})!8;=_7woTLV_Ni#_rC!K~5TmPh2QB zJfueW<<3Kj+qL#5c2eCNHn*N-&9MkIx3enU$@>jBO_cQevnNyt?T=XX{%3sqbqNHp8?5yn)xuG^y z_9nf5W4DTiiA*o6ylg*{(*f1Mv^g1#ipzAY#Nc`Ir(DgpK93QZsphLs!)k%Hk0c3; zVheS;0~n7~H@22%=oht4VryOb*W;0p`Mht> zKesWY$}2~e{Uoyf)96Foh{}?pR`G|Ur^PhQwT+VJYi7zjniO708t}i+Llyir_+f~Y9p)Hk?wU>XJ@gekD z`MTw@xhk5gam{e{j5Nw~I(@1&`NvxsAAx=V_dxT8)>>a z8vMf0;(Rd!s!BK38pg;`&3YIG)oM(nGjUq#fh&7_>u3Bhf_y@Mk9G?p;=$`hR5pSO zcXJ647s}$~x#?0vBc)^H`q0#=*Gz;CsEcwCkW!39&k!K>#JI2s7}g^S7a?7P2*3PQ z5>zv;A53tfv^fAVtBc&iIK|vE zodNH3?*VZM@H{8KMZsIz2{q)WJHW(>TrQ;ZPs-?I8r!`yCxK{#D4rY|&(h!f+WPlC zF+)#*ly++K4ssost4?2ODrOgHf{ zV1lJl?3r|5MNOdlh~xA+bMwwB1+Ao~l(6Gfu6^S#uOqC9qS79DYI7<3AM-fbLuI&R!c*JQysgy2O?~^;Fb^8j`uR=f|{ktuy-Ah`XB(*e31uascy* zvRg)MKC4W39*&8-T^O;$fTwhGND1Q)u-4!#)D94=s`3n ztpWhau^(zk3lSSH84j&3U3}Gcnt(Y6>P+0@{*5@(JTS!aFjm9RBuUm<6{0R)JU7Ai zMEc-b@g@Z?ZzvJu#vAnuizz+mt`c+Qr(G(e2JqxQ_MQwm2sb1?hbYmp1>yvC!?O4p zU_s-;YMRpJxevME*2Pvgb+=6&u8?*bIxNk1u~nENv=m57!jq^HaZ2(z`0K)6J5 zU+aq72JPn1bDI!>nJIEUXVOEO;M+-b(_1-bxexN$^f>!y%sBbk5@aMe=V7ha&812r z*rHTB!gb-1rj_L0e2dhqCLr(dA{{iY-m<MT#r8An~ zN6EC0d1c07sGx7zxyn~U*6hG zzrTI}eicuTG17uqe{Rzk@6<0WUDv2m7?7U$X5A)b-nep& zlaazU6hs~SD{dkhg=HP86yWX&eq#f23pGZOiQ8*KK}C2Z*p-YT4OL!WihHj7T2y^a z>9**rd)uMx`ZHHYp|1>v9H6WiiaC3=nIdlOmIzNy?x@D-h80^Bv}@0FmuS@u?sZo_{?vu@zv%%i{1bjpd z$eD$N-IxSqvVCEEH78_cVDcOAoG=_VR+iQ>7$ zbLA#N8m+8YaWDiic@1zO;RZ1WXuX=RVx6q=;jR`TF`g92wp+@OEG0S@#anwMrlxNI zXLW9I?YWmQQ+#xz(piZvkxX(wab6fu#Tc%A3blA9X^xgNK%aYE3*p8`cz}Y|m$^6$ zIE@6IBq6Rb=z|=*Mh?(H3>%>L^cS96BIms`wIv?qNd!<}kpcdt7u_iU{8a+IR7vOU zMOqB#8WNFp9r-J8jZunyNF|`-KF6{^fc$dHRd8l@9^ zr$RSxItr{y^7n_AFn%%gO{g%0b&Qp1)Y}5_)cgthcO&NPpA+f4Ds2CuZ2#fx21vBX z@~An!Al35uCL5_`9Z!=D>4P3#bM#3qTO4oS&5&|-G?+unOm&pN&Z+%?4x(U7GSY$o zbpfy{fX6fr(#LTS>3FbOZhGuxW(hQJ9x=a(dRJR!(D>B=cSS->TWO+Uq@Y{Y+~#C` z^A3%APP4XlukSc-Fx%M(GUR5vYOpfrC++2#NUZi~)ZWHjqGc37&JRHiV}gbe12WUS z8dc`9YJ)#VdlmY+|MWVA;~F-9z8+;Df7=wQ!(P9?n? zrO;{-^e{`Xp|yjkH=$@kP-@n1+4GdeMu+5kwUb^DA390QT)rS zrea=SAP-iX21`;ec}bIt0yEx{@AAHe3{d3aC?&37@$`tPwK%|Qnl5b;V`D5gl?dJ^ zFVp{17As>8#xN%wv^?oiU$-I#Ep}48=6O#4G{-6)^b)1OU@5B?=Fj92Xbl{hV3juW zG709)OtvEeI@uld!BHIm5*<-RTOz+6vnN0CWV6>MPaCfAH+U2Srr=~(XBQRnrT8H`y2@MMd?L(9li2@DO zZBM&+$IkC=Dxh&V6}{p5|sVh=Chb7680~Yu&1X;I8WgIQm%< zB-HKAfN80zKJ>8rbgC}_fdg8T)E09q+W7s8%gGx3-qSySqUVsZ!y@W~lCod>D=7KT zMyKbN3urOcfsjP{H#~Ic82q@Wn}$q)iUUZoUnn5lGDh}8HV$mmi%cR@U)~M11>EYx zwVG-V$^qck+CyU6w7R(AeC)_HColUt)fV6_MLJLe07oW22ry6|h=JsqW-Jb7yz}#< zsoRPmO)VBpuYBn?eE#3!m4^hmgcAg#+~|Nq9?TDXa&g)5#(n!<@x192uUsyf{K*|+ zuSd=fT;38PD@HL10I3!vR|x*U^kTuaxLbTUaFE;T@gT?^FfG#nr8ztivwdqBz)4Lq5AzwX@sn=@#BtfMkgy9@&eTB`+T9^+6TiPj} zXe+h%3VUe_sR4irBsSJ=7M#TQe<&uD_K%f--@5^!j3gES8K@61#*6#1xsz}hO}4P` zo;8;CZd@gH+76o>+FDZ;R9(Sk4(h|n2L&=FykK=0?N74^Ja?NNnD$BA-Rta;!ss;o zT`YKQQBWzhka0DzkRf^hb`+0!lsY2;5f@!4f`es&7#JH{$Cqh0@a$j^e_Z#E{2i-c zKOk5Pw1K+bTFvX=@H3Qrm`oC8Jf@K4<<2s;&6dvN1=E-=Rcp^|Xa0?DzJ^Kq`kmpr zG%=LVka*z>>aQ~Uuc`r3J3bn-eZV7OL{9_TOLU`X2n`K|V)Vj5FI@|-ia?L7NEEvQ zzhU7Zqn+#n!@kn~Ty*aoZ35U>Y)mg{ za=DO;SmT*Ct|>RptIYn35C#mPR%pj(BM7q`69 zFbuP)32?DTEXZBZQ_{Ef9-Vq$NNFxOrI!~=5Lq>chm+=TIDtmFH}xo*lWs{8nTA9Z zYcWY1_Jizq06R|NHa?ErygM`|$c%Jtn7TPJ^~`GB;O2k(BAdZvkqQBCiGE!|{ws=h z{d(f9q10bt=VA9~qJExBVI>ezvdf|U)MVmG?h=jYz~LWe_l%n=dsWN{yrbG13Rkw% z5+s-bf!0J@{27Xe1hTPH7)=JXB>%nA&#dc|$h&fTt$)+W!P@5#pWh58L7WEkj5Clp(a+#kl5ed$o$+_d>&wJ8fO?-rdM z7A;?_Z_N*NIQ0&BGm08{*5?VYyzYYPaEn+RfYB$Y0i)*aA12L-%v#hlh`h`85#i!e97d4sEx)E zi1V1qVXg|-8M)k+V^L5zy9)?~;+ysBqET-mOI5he4}t24N4C3-v|=tIbm+sJYL{1b( zxaM@xS_6{Q8egU11+#jnMf7Vt-=5>5Q!mU-;QDEUGr8(EQ>v9)+PHrY8ydgXEU`K( z2{<3AY+UuLhF-iKOpR1I6#7|?4tp=?+>8zu)6JWu8>Ou=jDPd{Ann2JEd?nQCnEut z1z;NdExAnSd_Z7T(dHf{fjI$2*JQvn0H;ipAO=rv?YkBOAg9u1)}^^t664ry1RbV9 z21V8ym-RpYIBm<44HoskPj2c>ZnDx*LQIG^4k>xB<)R-IrCyq}c&Hu_G_v9qq6w0h zXuWA0C7gPje>1z3@K|6E9aRD)#shvC12g~%3tZjj5Fir?MGM=bg_j?3ssI_=@vI#r z_$ZEwgkvP(1v^-o8_gRU8$iHuU-{vfc+r{4XWnU>6K!0Cq#UDacx?#|ta zvxd3O^MuQ|8;=GPHPjD!>Wq4YYtb@{PfiwW*7Z+EqeFfKM}762xf+fJ7UKj-crF9< z_6Hy*2}MEDMz+q<9N-uh>gYL{IoqEWr=ik8-~+zgM9R>4&IlohF`EHAM>Waf_?C$IP7tHlb z5l35N$q(MRxQ5Lz3R+{=(GVCyLQTcv6=S|i5Nof2cGMBg5I)Pgt%K}Zye%*+mcbMH z5TbCOH24t-0E96iB^uB2y9d)+d_GFW9}7ff-za3e_@izwwbm2Ah0gc$sj+>Tt9)aV zoZ-Z7n$W2>M`!cwQ=6(L@8wk&D_GX(zAu6Y5!57Hxx*&jT+L*H6a^T zD>V6q9fE0`dhIlTQIXdO+Q1OysasTI_kIuoJ+3~LTpA+Im>jCp{p(L4g7#DqTM~X0Py%>6=O7e*N36k`FGOPmcB*XlcGJ@X^`>)?y(&22l6#Rfn5vG)s3b zm}wO^t>Ns^Y4#rITaBwAM!C~fPskw`TQIlbpL8HRw~FmJucT1JNJ#R(%OUA?zZ|Bo z?=r(ieT$}3I;w}ujfybC(=bk3+xSfuBe+j~&Z_{s-*xX=+iJLO4ADX03@($S=DO-( z7&nB6Jtp<)_VSZ|0c~T!1p!1^YT0;z4=dqEf_o?u%*Yu;A|s=EQ&rkW$FtkU!8W-{ zIXpwUJQm25Xdcvsv&p6FUw#l^Rl7I8T_sp~U{2{|#mi-J;+`~@?a9=@5hHv@KdW_N z+_^n7@%!maQJB3BwUAo6k4bhDMHYa_WRF5F+otT;&_0}dulIQ!Ks=ycgJa?8#n-b0 zk-)f7t}dKQWzhYKuNC;F9$))pm2*pEo2d>n98_iB?+n-$ACQSL1FJAf>j|1@eNC}U zQp&bdm}GTy*Ow4Di>GK?C$MTHLY1qEX#N>ecQbI4n*hpSm+3dT4*_5)RKjf)X?Kbm z*DJZvra?9e2^vchuO}!J91*b^i)a5d(4hy6Z#q$QrGKa$&VRax>ev!`97~ zLbHQ0%54gyBD_VY4w)4&Ug?GX4jH@8Y^<99(L1;HV3FF~Sk7$&{o31OQNuFe1%;Up zl$S@>FsJlt0~w0Ij2=t*!Zp6#(?L@(pU&rdbUe!O8e|s5nT&Xph~BxFV2-8o%fT20 zj3vX_Yk*7F@nTolAXC(j2CB4itrRNS<!=O%j+7N#wzBT_hMv5u6~8dA{JI zrk9mA4pxjrR^g0nD`xv-vw_@$dNwZ|9iMi2q!@0;vQ#_?Dr`DzF8S}d@R}HrPqE6%k z8h1I8mg##KJlXWMs<$kt39~M}g8I_yq>p2{NRY>S6dokbiZqIW@x}mQ*v69mX@%w` zCPuV^RTZgr3kd#Ht~dE!>z7nIP*!CcNslMzxndpEK5e>+TmDb~F!e*cisg8IzhjIR zTU))JQQOHHwId>&ySEW50Z)%_vi@2(7Hu5#3vBs$^W}{V5h-TI<~%rnW}FF79;=Cj z=BJc0dn{;ED5Vj2o$WCAJGpVX*7@*U-^dVXH;j)^#-2*mDweohE-WeU3QQ!w5vR=s zuKLpO=UGW{o1Xn|V2b$uSMC9sN=X`R@>a{JZqM=O^80bm!f;of3;;1|9@^VLH~!&h zf~R zZ_7W@EC!h(iO95DB^2>OlWDW=iKZuPe*fqi*$TXq-&|iu{U7O@5OH+Aw=2Xf@~3}h z@?-!|d60@`~jljwCXLN57yVuQ#rOrQfF9O`@l6cMg$HwcOnK z_i0nE#{qz~^ZnBK+hh@~-H49N2U<5j@^Rl!@a|B^KV{k;8S2gnq@3=b=nji$Q*WVw zn7RszykU*=V@45gS?3%SAiRZVi}NCO)1g5m1r$=|3H+Z(sZ9!&A6oo->-%qmcwi;z zN4XaQS<>ls!M^qfh^847NRSqE^G-eoMc;@%O>2 z@2sn^ch`Y3+XiqTecxecD7p(1U(^h&xjX*aAPvk0ztzmEX+O!j>Ln4PJ-UPS^KG10 zlKxxEOA}Mv@FxyI-5A730-#Zh2JSDf>M5C^1IZ zbJovzR`T2OG2UyD0Vf+1eDu)(F9F2e5*=`*&iBBNjlp~7#pX&wkrYQA3bOj7bb%Q^ z&ie(aANyT*dsr)Jw?pN&M|<#B!xWtPcX-l$L_{aFz%wGh%y*;Hx!QSYb~bgxCV453 zV&P&`SP@qk`h?@;2@l4rr4>5e;(!x|zcgGtE<3Zwt2VsPUG^bsl;&iLKjXb_g2&SrR> zrDlu~sTebWFMwWJ>`Zjr{7Iqhp`j0@WPvFY%w4*SH3<&yp_VqzC$~;46FX01k89g7|~jS$deL&6gDv_`0JItbmllXcTGhCFnY;vt!GnLl$) zL#-Eq6v^NWI&n&9K^^h8)6AxvMRBERQ#Yc_tI64#4AHNH|8e6eYDeC^xRo&~b)v>d zaYKkfuT^2_#KyoXxJwd91psLvmwg$3VCwHwfsNK*n)-aF%tca%o~VAe+&;+^c{0mJ zP$2kgkI<|!tVVIA$V*|I;h7Cq8AND>yU5i zDsWnzOa;{fF-*3e7+Y@|yZu#HCo5X}5Q8VRsxmUTy=JqhUo}B^mN)D6fyNGbOcozN zoM}>y+17rwydNcuuRZHk&4%Ou20YFK`J+0#gWi9q}#o@kdtDX(`>n&if?#qDn_5IF8D4Aqy-iAeKfl+$1ti)M-}= z^m0$$l>eWzr^$uVQV3WOq^v#pGDw`{{{k5-?d|q7EEs>v`SWFGw2qLlGD{8_gOswm z+yfOj6({qAM7gvxTA6{bfjy1UvetGrW%m3`y8sQ2;P?0k?uE2& z_rQBnE9Dj9--O@S4NCuLQztc*%K{FY|1^VEDzQyD>no#-cG6W2 zb7U}{H0^#gyvOq7Crexj-Sji2>XOGxA0G=cYj4|esZBKJ1o8I8cv|3K3}Zml&6~_5 z@JUtvYS@Vwp8~^~iJ7G~S|}nQ2So9a47D2cD2E`ff|a(9T9P}@kfw@&vWAqX>bC3G z(6aciB@jw9HS8{ijpllYtRncGa-heAKlFFdPnyu(KfPS-+DxE+-Mgz$4A?@0d4ang zggc8J-6qqGlh?hk<}(`a^HpQWl233tXy9dn6*0mAHot<>r4z@Z zopBHfL}czEoy9OOtpEkXVaAApu9Kp+Jp|M!HC1m9>spP-+fWQvd@gMNeE-Dgj>627 zRmwfm2iLbu_Sy+2_v|m&Si;;{f`BPLK+bW(MPcQ$H63>Ncq;z<@kNmTHeU7Z+Km)a znkHHLCn*cQS$;+GxR`BeWa}QPrQo-cu9-q%uPOyg@f~vI#>O*PZt=~$RdPq6&#R%D zk2Yapj<9Rcbv=^$p+91AU+pxn=;B-)z&-;1qwn^CC8j$C7Fv>7U(!$O&#`E>fagqe zV4Ow4b3Zjmt;*92MsTlsASys83^~uy*uOY6{^oKsM+QaJ1SYS4SGiO4U$Y}TNw9^V z%d^y`w+HU5=hn{~m z$`J15?)gPLCq07-^;%6qL5^^WyEFslfI(F;s&C35sjQ2=iRs&sKk8F|o&f)M@ZB-kb`AIrv+EAt(; z_AIqTz=|-`i1ad1JtTv}X!-4rQf0fZ5xrlIDNjgGktNizmZ~d3%t>GSEHwJ3`h@Fv zTS`hgCe#gYFOM&A{5>XchTu87-Xms_RLwXFiV76>%-*tNSPS{L@Ud_)RlWjNfv^UF zk4$&U&W7$^EFl3skoUH`ts$+EBgUVyBx8-dpraRA>CTOs?gn zHY1HYDyoDFUC^m_G5&M8)d$bHvc^JDLcNHg*}L$#a-mvi-c7X!Q2hZ=T^6L$)J^f; zvytKYj!+2-jskQ@0#`nec{th&yzJTb9(mnPNRAH9?DKx+)B{_i>$x1{2KJ2DQvL9w`aVq3t3%R%IcgBkJb>p;=%nt!(3}<{D0pcj zagcvv72E&_&Yj2T1vf>vvmTS&>+|r<#d2XTeDC?2DfwkZ+^{EUc;CV9Z_3EqGlG13 z;^)7g{rY=(c}IVJSSd0S@p2e8(RgK{@r50p`t4dv)N3KvV#Xt_k(xYN5a#8i4P782stDFVJK^LX_H)O(^k&4-1<1)@1{R&#(S2P zKgk>J-g{Z%z>l@~-Ch!4EPkix^b7FkGH{(Km1AX%b+n7xF@T944?1|*eg6V>TJrsT zjq6&Ck{QscGb~_FQ7g!0Q0&nqyBbRNwPB2waef`VtN^9If+h4Dp}Oy+T1;O823ZQqJ~fT$)KtzkR6Qrfz6Q{XzY)+_osyPo>fR zLq(n`Y+LTo*-TVZtaq*rhCJ%re|_KrB4?kCHRo-Op%ulKsnC@LJ^Z5))&ZL+JPz7~ z?v*`|b?pc{GH;W&t=k;Y$ihCKp0ugKv7R4lGRXH5ED*GX?Dr>`yMR@+i)Mm|d0)G~ z_Wck0X;!XsR3a!6$iU_5kmSIfh3KUuxzh!PRAKx48`0ppBg%sw_&0L?hG{$`4G9rWC{u0{2-sCBHIf#lLUaG zzP}YN0{)s4W+I$92+rI7ONL-dDHsPu2$aqUAO)TMDgeUWR~$vOv&Qnqu-%+@kLAgL zXU22K7{&33NI@OF6`lw!iq^Jfl=;?d9(&fmw(&I2CI5CjBAun7YoK&XE8ZgOS9GSJ z{E&z@jeN6-_z<6UchG>nbuRkH3s#5EozF7$5=?L$AUHS2P50}eR z4cy~yJF`cJW;O~PDCehlCJYt1bq1_QID6*4XsKyruQ93O=OD6pBRS6(c{&T*MO-Jp z9gI4jIQvr(%kJGu9AVp&X=Q+wI4=!5N83P4ph|r#iu3o+Rel~vFN<4&L|rDt7$9>w-yWiX`RR>UU%(q_&-T@h6PxFC=O*0 z!?Nqw0k0={yj8KHaMdwlRP&j%Un6DN{@a?(9Iokq@FFEOVN`_xCz-Hsh~+u!cr6^) zb>gLmFP_81AAYRSBqQ-o$nR;LS#a^9Ob@?!gjrJ_mt62dqM z1%pYOcFnvP@jy{;V+*e(3ZToJz~zKL8b(+$)H$$CAXNsC!yZL>;9BP^NCa|G(NtMP z{e`_1zG0M{;2-Qb5c&-Z6~>alGQ@)G=K*h3(#h~M1h5zy$bOXtcJSHe@S9)>uz!Ui z)7TZ78aUakS{wM=zED+Mq&dRfjf7v?r-AFGjdnG;1IGdchYn~ml;%`|c$B25rj@cD zIfp0*_nJ-eRlG|~RSntzb727BS~ORD53Xue?upU6I}Y(dZ{QIH0MO&mB4{fBb=*5E zD#Wl9KV-o5i9mKNiwvLPh9??RPXD(J;!9>kU%q0yQEg`Z)C2(nlStA$VPp%#eV|ae z985jSi4(5{)k2y19WfY_`LVGa?&ujYy{%#H((Ph-?=$qod4$_VDfxWFJ7a}}7s7P^Q9R$xfxx3x&{z{W4 zWmi^Mlz?T^!2lp68bB}uWb|~IA{fa6B~-Tfq@b7?$BXW$-S?;eQ=%pz|nSH zmLq|1Cwmd#sYCY|*IEJ#W`sdiF~HoAxNb34D~f@FVMuXBH3Li=zBi^O)p^I(yYMXU zC9U$TG##DXrt`5SXJz~yq`s2U98-X<7Y`_)7N$bERs(kedQ|+!fsG0ET$Y9PWuCjo z3!vxuM^J86ylKR?xyICnYgetDy&pasCYN7yQ5_8p!Qg~ult4U@fQ#sZVO}cMakzm& zKofzeKRfP>c>+V9BmAbvwn*x4me@v5q&0cnHtvK!0>F)H>Nkfs=h z!eu!{*`8G}Te@vslAfU!=Djwx@>)r^e|zqF>@?DglzM+21=Xnk-07fGhh$-*Eo)Uc ze5p4j|81ue1@0h>bn4k$T}Qd%Sg9RX34HhI=5ob6zVZ3Es(qqmstD0<$4kS=Y0{@Zj0}3p!Ui+JAW&BT@nE)}X<$g-(R~CiHlK?>ULyzPm^@L%Y z$z7Og4w*C51ES0dOF#W5?aX)Dn7rO+_}R6W$Bhgq%y;{2fA$jSA&)Jk0jl za+7>Wm^Y^1$&yn1iGm%P>h-1-#G-M$cQJ6|TD3I|%rM-MF&t1v2;QNQAokr4`x;kJKtxCeSvT0D{+P3p8eiHt;t+Q)d8C|JbNU-;0=FAu~Qc zlaqpS4?t|hR=5J!XOumfQoi)9ITQd!G6Ap~(Wz293>!=ir;9|ut&d)n4T6sZmu?ME z?d`zROJgBIeG_}e6dTCIvU1ap1Iv~OO2Y{b`=H!byuu#($WJk#%`5_Mk)(ZF=O-#Ke zCCwsB>X67-un_uqplOhSq6Y_1?zgpQED@sN6T^A75QY;T;lv=p!bE*e$sgbhoO^mv z>Aq&WOw;j2UxT1jz+2VppHE!+HX?dMR;i!~FqykTWP z-`Z_95R<&?0Ya$$2YGMAf@Lk6e=9dwjLZ|;9j*hcJh>lz@4@O*b79j}0|_AC+PTWh z@qy>QzXJ^%l`%li0@pcwo(-Q6f0cQ?tRbCO<2pQ1B={(%#scb^549mAmR(NtXCz{H zB4nQkUtpSc1}3SL#)9O$YGd%ZPhSajPdB z6L{_e0^2(#_ZJlMGCqo;=%{}H#4>$mZ<Gh{q8haPmcPdVCn9#p--m*mv^;b}Jw(KjG-dwd*ZTUz(i+ zp8&6qYS}Vy21IFQ@)j!~<3}OCOcveD06NN0+n$)#KzWd)XOdxv?fc!$Td&HFg zib9@VyqH~wV6*_Q9j574&rAGb*wW;U%K#e`GUmaWs(9!2cJe& zOb|e)|FcS0I-Upc+=M=0QeQeQA4)q+kHAAqPeSncj3_27ot0Rht|frrQ%Z}tB`;I3 z9U#6;mhw1ZMB%Uq;dzYa5(Faagw2;m0HPRpF^dD_pNzjLei!TWY?Q+R?^ z0G`5vNmk&O)}U4EBjR_V1j-YTIv#XD&C71iD{c(Ge0-7+4#i+HJQ;~mC>S0CF#`Qs2^z zC(#@pOi28(w1EiI1OV9>08J9ufd~mhs}(ZY>QF^hm?GT@>K+jR*(^e_0HRnR`uH4% zD*g>X_@JN`fD1BAJryQM91GGqpq(RJK6T&+bT9dD>}0ZbNphK0np;|ODu^8qMAs2h zPnLd4C_QMU3AU8})Gx!+!5`V67Z2bU^Whg6*ZB|qZwATag~cK!wR9TtB@Sb|i$v4e zj<~Wskpotorp3@~7O+r+tpUUJg_Su|#F@kEe9}{r)0|InbTNJs?tC!h|vms>j2tm9e13iK|Eyh|+9DDhpkhJejCh@ z%ciFlSS~EbB=GFgIYxjw6schsz-eFuG)c^yk^7Esc>L>!ty~O-M zt`&R7oDDEx-V(P1y8Z$<__Cw&U55*M?tw>>%gYWKl>2TQ>;oIr1_1ptA)Tk+e6=m< z2G6;_2AM|&fg32fF-*%tg4_~ar>d?c`4`8|LBU-HXEwk}RT)~>Cg|1Fn)AzevA0rI zg(IR4(N5s9o)8n0ifF?QJ`H%Gg9tIuyxjzt(%%#ir5n z*9DjmQNK=7k^~Cd2Gykb5B=&;%DyWc@AN1lMunq0#x=2|4B||LNG!qTDpgu8%cL_R z3J)We+0RC_H|H~(qis*58*mLa@IJzFZmO_V0V*#tTDqA>;_b_970OT|qxU2WSTzO6 ze9($fW}B01=GLDNOYX&<=V{a%LNc;-!%5vb;!lb{&E3IhS@5mJAL z(i9+Q1|T`OM45P3Wwj5((W!o=*ov)N?&6+^ePG4jkS9Ogcl<{#tOs^wT=%DU{<9l;-2SLMyPx);^)eA2PeNR) zgCqYiT3!T@`fsSdiD*36W3}2`k3IgRkz(QngAlF_hS3-ulAe$1Mj?g#xvCBd)gsx5 zC`}Y8LA|cBiUd7PC%w#dQkwXYfd$Okhc4*7Qk#> zz0~`SLoyL(5{g_xA(;p8GGh+pU*@e0m=&g^#N9Et9NM1^z49JpRR=4e8&7{_dxVL0 ziG%he18q@IYu3ElE2ziepc4T$tUNRBJ)?~^P$PgD-Z#5)r-!}4ip&l%)^j;RzcW{N z)#b&(r-^SmVHf(rYN*bVlO+KrOF=$M*YMAfGu@r{$Waax7r0)uWIwRFQocpfh2BEJ ze+8zaR25a1xudwc>kyuRg#ERO7`ibn7kXB4r2)O(Kxb1DivVanddAh`gx>~g?$$+PBR!p)}CLiL9-%M5C9CX!xxKqfP9OWPub&ez5TX7dPI?v%jaLq)&WG41qxt5&9M+ZNfviBjD&?4*Fo~|9IL;p z0I$J|wJbdXxYc$c{_6W0AFwzb0B63x>f0oN25Do;A^1TFq*LcP-Y^@mf;WaSe3Kd(jv@L=9=4c)z7Rf<8E;aSia7VHY^XkY5o_VOi2_EkvkZTJk=jl{Z7 zexI)EN@l_nn*mY>wP$*Y@mwfn?nl@!i}@&X-xZ$I+$_Ltfz$TFnjcdJKZ{F!`I0gs zegk#q4DTfAiwgI1Z@}I<%iH5&gv#|m%uefoRpS2EL;277It_OjTo7M-o$fE zGYN#imAWqVbwHJ0TcHVeHIjFvqKH{vlb-y= z81g|;uE8Q#(!#cwSH7X5JVYjfOZ;Kt*Q>4_UJi?$zGLPVzvOq^UC)oLxmr}Y?Rh0G zB|oKzxvOhl3VSP$v#`zQm2WInyOK7$e$u77c;n6c>+1o@xpNjBa$ycaQ$7tu^l{rR z|7?xXMS~bDm0duP$2JI|DHD;_%u_223{11k@3kt06n>ehDUJF^q$+naovW|LNj~}6 z{hnE8Q=?5ohAYdp%-=k7E2%_v&2P-@i0mWKsq!$wQtfhvbDCbV{$MxHW-gNo=cZgLwo~wT8QEgS9*tPYn0BzJLSDL{IWf6 zjLfv*aT05DQmjpSnW-e6vUA7vsIgJ&nXvSGV7gJ4l4+sf<@n&18igBi^EG$3+V3v^ zXfK49ra3bC==<7J5#<1|rXG%hVAoW& zrV56nj%2?aAjzytb3%)IEhYYTgN4oI*kEXk{2NXqudRvu2LBFSo?9p=^ge%+Y+GXB z=CjA6B1M)9S@H_~{MJp*-9Pq)5BXAIZQ^s~k7|Y4|1}9k?#ydd*!+=c;uyD>czs||foAPhuN;I7%b!!`wn9UiM0|ODqiQ?-zTO=JXW1N;!g3%i;}3MX zC*7R?vs`gPV4rN>KZY33(IAhfdBJJbS!JFaSDN`jy}o6Za+A_9q)_UqQCfNXRQ ztxG0NpxxzPN$|HdWw>Z%wnbVw@h+!gg@a)mtyojItw~TbLKvKH8{O4dx^|vNp)xGT z@}+)CU-_5C8-{gE8YR#868T9-m~A^O6v)!n8ivsh#0l0+bC7 z1`C3@eFrD`o#J)nXgRfo0IB}CsKDtz0eXq*t^Y)Rh9(-#tr-TNI@5OHsNY9M_oa~>vMd5{T(h`qjbudF4iG@SxhX^;V!{Sj&_BPem zYyv9QDNRj>__GNlj@X(9ift#P34ydnMbbv#3=&Q2^_>xcp;3uv+fYS?JL%Fx85tJ4 z6FjaJV?AwqXcfR*gMA!Ei(q>8{rLicXLLK&9j*)4I(YD?${8$yPEBmccikfGf+!U|&sp%Ay&eKx>e zL4`#>%+rtbONXU!`C8m9s&AD|=V7kLP&a=0CDMy|k2b^05n5*^JoBRP;S6uz>KqYs6}le zpDJeZ9S+dVDKXRQnhhqEoLN8(EkBf~7ppU1tl;ZzF)!eoemWBVoCdwT@& z>}b;ZSB^9)AOjcu@R#EbP&1=V{JiOV08KE#F&R8MGV=1*QugCZ(V`Yq8I{KtZ(D5} zuejPe|6|W%An&QCS?sFv|DI3OS&|rPc=KM^LvV^Wuw_iCErh(|xwa_O)99)g3<2Ke zYD7cf!VI7n6AilT&*d$g%A1g1klOAq`}}vyg==CtxqRU&L_zwlT87d-LU4_Zw(gBn!$BRFYR)sct^z# zNLE@&F~jG)--tO5J=U%zKb+gVOpSk;ebXF8W@{xe{4C9Q6wF0E^xC24QYn0!1dXHh z+QK>kBpCG>3gy}Rh|q|@neQ#7W#yHRx%Z6zmNCuDW7qB)SACa#T`N~=QeW7`$x5R( z^NnY6z?1iTpT%X3xXYSogFec44MqwKr)0nqVWLd-`_i0DH<30EHwwGl7*w*F1@(h< zm-}I*Jx;ZQW%3<{B#q%{=f07#=3>#tIuqS|El#^uv(YUq^z>2UNpka8-PvUE;fnUF ziE8Y90$iEl1hDue;FFtv3i7vSWO#3sTPV>fAN-Vw3laY5M;YEhVdbOZw(nr4|7j8_ zClt;>%$^i^?nUtKxX0h$x983xod*?hu$h#jx&l8`YTLE@G6c>GSogp+f{sjAaLdR1 zB`Z?eWmxutHBV;ELotItK$n6HbLo4n0d>j0i7!%O`k!$z{1`5hyQSYAzR4{C8@iEC zr>Ra8?tPl)xw-z1e%$x_kNaAj#G>`tOFD5+W_9!NsGGvzG3C7T@db7>daO%bJ~#8T z>kRy$x6IDHXVK(>fc58Oze|oVV^6J{zMCCP75{cHRCSHQ9JW96tU|V!c)e;ZS0PEX zU_a~f5ku zOh^wOpFH)02XGGWib{Ol%_vYsYj*~dJ2-49P{?NS^IfVo8P%tGz0Mv=n$qx1DgcA}zL zu%HPw`Et&w*uhv8$7UArgGpbj9Gf${ng&SqKEw-g+7Z=48%{ACIHfglDlL%>@0s<4LqVi*z+ARE zrYbF*1;h2El{uMPjv2UnK&|CWqz4{3OrNZ^9jUnsQ$7ci5*0P=gZk4|l2t6gkuR%dWG2Ra8m+Ztb3F`;pD$Y@54yPO$hmm1Lygt8CSWGo7#&D3JkQGO7!a@Bscgw*HYoE@AaIYHjiuG{Q53?yu&(J2o8`rA{)Ux)R~ z8YjX8q=PKlioH*5;>xkh9RnQ60C`)7jOxx5hk=ZBY<7#m2Fq0z+h|E9!;x`JfS>lU7fkx+WBi28n!(XbjTqks)7YDAtKUNEC~UX zaRJ_R`G?$Ve{9)G@QR};`0-K0lXvG0Fi*W&pE!ZTbzsMd!-} zQVjm9=*YaogIyCIEVR)K&^dpExh_!y|CZb=m@}($6GO_`#ZT|y{$f*@_t@a95b~f zc%>u-thWr(LpTN=8M@?sJ{HBmVsf+T7J_ zU|wtPS4+I60Me^$9<2i^PI2j}dk!?8WtuB27yu)9Ji5ATWl01Zz5!%0u}Fr8Xa+!# zaaKG-i37}5@b_%dcq?y*TZ#9|X*!$9LFyx5sv7fz=q*q8&u-<;veuCtCG%7>6wQ?m zjYXJTBBa;76~APGb^w>QeY6k!`P`WW4Pnt7FuMMj#WpDZSvg<3gM*vIbo-{4w#hU(9WR}lqBlTxoXK|-EHWLxLx#CY?EN~t1VS6V}N+# z`Pi!h%cC&rxJh<633e$zJ(frd4QQM6flfC)@|p8KhQ=;ia1iSr%$mb4vS`lv(1jA3 zgNO8Dl>Sl;-?MEKLxZQwFT1Yg*0fQ~lyJ+`T&*>e+B;1I50;NpB}7}3YK%xVT_NK% zUn2lypAqug-c|aSjBxFN(IQ`qL#iX*(O-GA+9ZF0&U*T}Vz=O6`@q2!k%cbw!bOs`ES$2yk&~nFrHDP_Py13508kghH z3v_2fpvQ4~xh54rDz`mFIv*&4A)`Df+DaP_!?D_)R7dB)X@P@ z0RXn{^A%YX{%l@tNrHU(`}&bedUq@A!9=IDAk6^pR~`$$l;C$5?EZ{Lu)PZEM1n2y zv@g7ZxW{oW4hCF(y4jn}NKc;74YQ8Vs#ykdCUBnfL9c4>zk0n$(A`%=HiJ~GhvYDB zM$I580$HBWVe&6kmAPsJ2{OP_Bd_?2p9+#V0AlnZ<%=7?4b~d-gKpLZeWJna1lu?IJ%Y=Z+xaF23`3%$-=5*5w!@OS&XSBOz|>UK}g_Q{oC zXEbz6InYD5=-=|T&c5RMCIN#2Ngr0K)&WJ)bC?72+qRIreDKhpz{;a;g9~Z?Dt#23 z$zqE7iJpak}9`9|ULqBm<6c*m`Bk;z0DBs4@aEDauw`sDM)>DQa*}JCO@6V8y z(t-$7EN1nxb(pBugnC@jBnp?FXPx18KEutfv%j*%6Ksj1zW0YXjj)zgsn=)0w?&Ql z56GqlABw+|Q3vGUXeXZ3@bfqOOAd=8M-6NNq2~WUHIIEKzlM*Co5x4Lw>br~I~6hQ z3J<`aF3qC45}?s|5hu5(cD<1q@46WZtlBm>$Xd%11-9HCTRDLT>sp_@ZvlrsY8ArFk+%DhH=6~%@deL?LOk{gIC$4&M9j^RF^875aQ?x9g@(q{^<#%H-@Qd`x2ypK%mHR!>t;lROphL1xPzF5Z*+9aBQv^ z)9@3XKgQQ)xV&au172KxkTl&Hp5Jrq*u5sZt$(ny9&-S9?@cYXV8%|QKR&=L9B{p` zV2$=^bxv%iF6is>uauKb9L4U}kQNOAQVE}hFI#FIS?@*-&6bjc!y6$Z$>8e8z9y}^ z(k~yPI@cD4^oDn%gCks^UySoPP(ALx(I4; zM%rbii+9qPKGM^78!dV|4>sKFPG0-kn{!bN8_$(%go??~|Bu<1jJPk50Y}A2kYc`Q zemn5JVSb??%$wb*09^2mY<(kc=2VZFN!D-AQ2TU&hKGgnH)vlknYxm`l-cY#JMOhT zj;&Xl$0KVxTxdZF0kcySn+%wb@N#RT^qu|23(GHWrQD4|+1>5LZ;l1`s>kbpBHnBK zdjDH*rpK&)?%4;OXL;!WDG$(jIJt=4s-VxNdc>gYOyf>RfrSkqk31pfOrW6fWwZQm zpX9#O-Pjr*h^vo&|5L%yE%`^d5-n9Mu|N2tdr$@isV(B(cAxVWXP@y;)UO4;8k5BkB zmzMJUe*72eiiaM)bhJUyQW)u80ElVARO`%BN(y}4zK`;%L~%96Bj;|g@R{^2%A33^ z+&6x2K^{NHb8)f&BEq1pX(JUBND4rPAN2vn0e?y!r3Ocz7^rCtb^Ugl3ErNsB7XW= zGsF|Q=6gx+*Wm@~?7tJ`TAdNBKet%yOrgKBw_-^|MSR@@GK^cMIvrnQc)r_(ryHgr zq80t`U=h?4l6%u@j!EWZ`yw%UdHqanT>Ad1QJk8?)r;w0R(mU-MK4X+WEI!d23}Qh zat_>P3R$|MO=1GZGLRDb*taBq9J>gv-Gz;>*;Y`+F1e0=K(@%Z<8rr-Yr!(NQZMRV zU+zc2Xm67XTWkFn-ys`@GX5EVzC+8e9i}2AY^#OmH^=jZPv;%uzi%w_MI|DFelqWb zFLV}MY}tRIleXaUv~sZ{U)sHrqI@LhK}Va-^RK5>; z(E&0Lgj5tWga>vms#U&>96cCQ<{OGhNb}23l1V2}O=8Leg!C*$0!3~0JVUOBmwL*M zC4@K_G!%r0Ms)viwwAu#c{eMpXU^?hF5AXErbaia+uq=%_oyRL1n68{Kmt(K^rmv< zitOcw$L23;&&5f^KT|4_zx*l@o?YhKFk+1+XGo{^KFn)7-Rbk~#rTTukF z!@Y?ls1W|MpBL!fTQ@Rn=%~OwHGThWnM{_kX1S!}p}%y1h(elhP@$(nMVfTL(u&R^ zDK#K`r@B;BwSZsCE(fMLhR^HToQTlqR>IkrzBv5KeR>3K;~nD^$1`pz!N&Kr5FK@q zx7f)!v9M%0yh0ws*q)y*^J}26EBfcHL{&uhZP0{b3$q2>JQ1d5kdKmd2Gk3P2s;il>kSSF-dSaUp?9f?!c>j}_koo%o=u}e2( z=F%zl%+956^BkI+TRYG6tdT;I{2E}6NTCpbS)|UKPE~jJv)BB4J)T}yZk?z`-LjEO zLq}OlU)cplOU4x(JuK;WouCgx+#ONFASLRYE6MArsSr6fKlcUYXG3n7?=`0{lhOp# zJ({GTLNX?;$Vapyq+EH)S`$^J|5=mMGf=a=ojNjQCarxn-*B+cdA4(`xaed4-~-O? zcbG0yZS+m_<*$X4dgu6_opR)uDZ5QS^-a!NW6(;nJKg8X9%MFrpHn811YFvQt{LZb zAOO)To-7(vkYh7D{$={@y$f>113W+0N~6Pm&?Ew;l-I9ab30=?CXPEZ-r5@9r%+F< z4(!N%^BAx3s1=u^@opl};Pk4CR&`eu7=Q8ncBU-Wy>q@|-`1nhZKremL1g_%*xjO< zJryOrwYe7dBkg=sb_{EH-GT)~CxDPdtnpiaGW(QK>Q}Grkz`FJjcfW4`R2=r(|=5( z;}(3=5C!+ANlNBIhL1I~c={4isj)js=_>e(cg$J?QtG9xqn7j7rz{0dGMymFl){t_z)x+ApXW;#zRiF zO_PMd9gT=~h(Ogj=_G@;acwGD!YCGged*;*1y0jp`uN*;+ViPCx)xQWkpOn`Y?Mi1 zfl%9Uh-x2MPVIxE@VE_vK3yS?M_C-QlFK;KCAWHJ1->U-{M#Rcxn>SmprSciz0-^|NY2`3+Vj6l;&8QBUQJS-A@1NZ!{6%o8e9*2 zekqf?t;tunKFjgYRY&?(0Rd;}tDHA*vuhg~F2~7iuBNq4bLBa_5xTn;?fZk}a}aQ6U;wgW9f~`$7wA37 z>t9aQ+mZJBwe(_Wd)ZP=yr6&T?%bn)P$CaxEmdO`J@YmZnB-Dd%Y!{s=JUOHCFlfL z1u+c02Q_uW(IEl>^@X7adt~G{_~tul?JN(75?_+EP?whZb)x-u1kc=u!mbDPlb`cG zPi2}MCogLcItaPOTZQajQ))sowD5CPHq>F%^m1BJ{S0?9XP}9s<^win>n%%Y}lnN%_(LLxG?K4Ne6gnVt zQ;DSs;TEe}N2yXFKlX@wWH$^r*Xr8|+>16|tehDB}Uao7*;yivQM+V9PHa34TpX8>|g9 zdi!Q?1>hP6NIf~3$?i7oHRVKymOlF9c)!RXbFv+7usp1hjUAg6h}h?-cdloe*gsHv zw*M?YP;%{%rVIF;tsvU_x;x<)mh=JHKK)qY-Rh4=Rwfa*g!YfDs)f~++r2sB@>4c~ z{mvAX7Jqj_x81E=4Ci4*fA&pZfm!mzJC`~~4!k#6am{q(y(^>G?jPkNga!&DucwZ2 zwB~OIC42unI2`EQ)7bY@Z>X6*IRveVPPdWC%(`7Qe;u|nSG8b+`&chzim%CsR_yWc z?YB|%ibwbR$?7N@wPf7NxabNEVuN{NWIuT_WAyXqG0_2^uj8-Ec!1x4tKXb%ID6c< z^Va9dtqQ~+iE8twZk(o{sD6+`fN-%C5@9+3VLz)Wxx(;EJ)r%8)&!s{RaP7xw4LKu zapC3h3Hu{Oc)B{z#oCbogJ26Ft-8J3$}mW^K7XEG#^}-h-mrEMRfL&?A(^jm`N7RH zXOl;tGQDp7g@jJlunUemEx&pkQ(gI4Vto?uV}K&e@YSGg6B`;XCC zDAhtBc?SFARb6$T1+R<4C*uH!@N2=oH}3e=8)M@>JwV0RK!JpYp)r)-AM&H^^;dEu zH&>oEia(a!S~vgihR%Z4Q-%SpUWy62U|gqPHzG+K zF_M#wDL0i*9*Z@W)p-E!o}qs5nAD1cm**@A7u!^bFIVgW`0H#a^5qe)(69myGN-BW z=NcLRT#mjs&c6Vs)qq~bPbCP$BKE*jHmJD;IeyZ@Dcx+RBz~P7+tmbPl-#Bqsy3LTq}r0*B-f3aB1)4lvZ=W6-oy_(-zl z$lMrm!ISnK0~mzncJDnO)N=IS*!=}D?G(7IE|dnd;1_a;6mwJ z&oilq2t|TG>gA@id30Xv1Dp|w-$1`b!!*g9Uwj5Ls%y_2bqVlH0J zC}VWDN$HYrOExSbUM1CNW<*jcHHEAg&`>ZPM@EP7&DvYpFV_d%Z7Jo)NeZ-;^~{2$ zOXikCcemc3Ydj0>hsu6AbFMtHA8zWC42)q>YJPD zCEN9g9r}zBIq%dFiIB$94gecSTwr=TA8D_G0{?XY8=#WgM_QL!vRR>5-wjLJgH!;x z;Izg{$Sxz#n^&iSb4Fz(_5&|*kGC3lTTjV#Wc`9kWP7QyJCgH)?UYAhu&3ASsOZRt zQBE4kot95WHpUQ>UQR{_YPkSGqd&n@`)~bzHP!Rp)?=7yCa0EBB{~Oj@@q={zMjFK z-GzweR%m$suia)4t_60hMbP!5xPbFw%e>s)t~p5Y8%2xBa~VSs!wSF=s_+Ty56?Z= zO8Qc4+fmAadTl-P%N9){L--AsdrZCBc(ZclyO7m;A0B^SUt79mxv@8q7dH8C{v=@O zqvxF8Y^??;LL|QN9_7=9!fk!PXglym(IU8HCGu);MKBx3QxY;Z;q1d$m2JunSYR(X zjgoQ(wEzLB;Okx*P#pFF`VZPUAqe*%VAKb7`K#leE~~w!!6qTAGXfXt)UxhNe~ME0 zRH^Ro`FJlBAQ*3<5g~qtp9Wh8?Q0lh>I0(d{>j(H%GLdo`4QXY7pt);n5y6D6+5w! z5=`A%DlYXo>-e)6oewJ8ro@NA`L0F$lMJ65$P3*!t$>(0`r{YK1J=lT=QUIrvpHH#5RodR{W z_Zq&%`3YHBmnRHxkba)+9p+x38zIE9pC85VvxtF^J8A-`^j-(Y# z$w7Dl#4rlcjky^k+Vxp8P^SI%jdR82zbhPg|Bb(VttrWU{(|9!L*bgdwy$~*)2=@S zk~8#Lsw^+ya(LUvj?SCPnc)8@TrE zuYZL!Es?rXRs(m-W@udT3kyLdQ~wjfA6rmJWwm%g1iJ##UrY({bvKaL(&fney0gyL z=9j!9$DK32=Ti087Uw@-YEA?_f2G6mLdPI^l+)^q0pEU>WJFziw|b+C$bZ~uZ$jXC zR^WN_YyGcof6zV~_+9FsG&=sfi=#!WoqxyvxhgN8Y;cK#!St4BdZiQ6Tw zd{DSPN_OMr^LJ^TQ9AGaqW3@h1AaW29nr~8jn>&}asa6r`#9VuS_5xq+FnLp)4%kF zZph&s|43V$t2Z!xtdLnLi=ZT2@ErGy*Q-70lv9z^K}xj06ec8=tk|Fs0TtGffitnZ zeQzRol}4h09FeZ>KQGt*y?r3c{?+)I?=DT^xdJ`D=}Uvoo%Yq#`|ec7!z0xUP(-A( zyfyeqWEUYyp16(bq{RG7rM?75pzznICFiR9<+_)g zB4tBA9_rPST>jPwe+u4@+oENloFI?B`vFX-z*3OT}QT zEs3V%mps`6-i%wUtFG#E#Kwm@`Z;5lIkDuhJO#LG8)7-#XlZ9SUe|*}f|E#P{}zUH zw%eYe+!eZPv_ILr==CPE8;w0MTy?%BM)8&$b-15c^~2Ec##ci}{Uf8B8;s$Xx&$Qp zAT04zNYD~hJUCtbU`*Ki%~y$Ez3_AQFFZ^-ZOCQWgGaJ^V}YFF@-F2@pLX`e#C==J zXmB~Dmn1b2R9|G?hlV=g{tucySNajFy}BO7(LrGbC|t#9b8ly};nlcw#pK27eTJuv zU(h;od7s1-huV9qJhoGi*nj}f$%gvJzYO$FI=gG(?=6JShRV@wU~ zOG(sn0BrFdI@tz8e?*Qz1lA>ypVbRqQv2&;o`Z!RoNFD z&(~-XM`lEg-VGE$m!yNT{^}x(B<2d@jYs)X;g0kglKg|j<)NdbuK;I$9d7Y*p~lI^ zH)qc7A!+?^*KfCvz0-&~00)-$8m@4?MN=^O14VeM1fHOE!P#{1)`hNfbN9=?7EYXK zOFh9qx@9z|;&H0Waq!)b2XRs=R-h{e2=DC^;tBU=3gqA)s?CF7)t6>?uwi_yQJ%x0 z&)5~7_vZ7fdgP#Ch5AnR7TM950M4HDn^guEUsA)hwSt5TWCyVo!~S4+nYu;fGM1(w zfH@iS3kw86^TbY8LZT?C+q{(?6V=19@6R|G$gTbn`57}?kIU-hH8i(A;ojwa-|N+{ zlHKL-v5fy@^qz_uU3!#Pa^j>zv5HG8yMVKRvamt??!?c(M<2_Ggwb@aY>v)^7=zdx zXx7=sA4E@0Z$|*N7Mkq%pB>+WW`EE9rn|6d-y+${RXbBt%O&D)0uoK zuLl%GwOld+YmMhLoti=(;vM3$n;SnUmSa&E)M84Ls?MT@`P) zo?pLq>RrXnZSJKm|0jiuk8X6_?Fn0vd4J1qt6^H*CGG6nB2RWPRSW}_P1JlWm`$%H zD=aiiChxRa9SaA(a#K*d+6NeRNZ6QF1s&V31EZvcj&W7gWdd8`#;R*DkuKlTfFXY@&)B=wXb)9 zorsgZlSK){-P6MH)P{w9^=a@!JlgcePnZPmW{h0cYy%-~Os0VtS8RV`@Le62&ns;q zoeb=?bhij!;LZ{ny!9MEe`2~l2n{pw77w2wWDFR0bVB(j$2H=_#?Oo_=B6{{VwPe7_J< z7K;0|xk0sC;)z}P4b_VaVb#@=VjV(;Sr30nrWva6VhH~dNDu<@$hX)jgqv*_)&UQ=Gt=3jO!w(l&{*d>u2`cO{|S&fj-d)|&@O6q%EKyVvAf?<4S2*O zhw(P3jpQLj8}0yGEx1rNvrP|eM6e+dxUdFCID!nz|n=}LJ*^<#X?XSF&cr-H%R})*u@ONkyU*JR!~U73_xbMBppcv zG8jS?<{+Oc2!WVeh@206paU_6QGYC`l2OV-g)60znrUQX8%@VEpWP8?-K^ss@#v;K z#>tO>RD~cXkq1%Gf)dj>#U6ijlnHh5tMgoT+gfyGQ= z@#Lh=glrSAK-nxD<+9ey=1pQZ&ClFuw{&b3)4GpaZy}Q<-UN$Eq1XAU>xHU!1x3w z7=dwd2jU7n*W((107NNMGq3-Fw5ArL(Bz2^t=8l^m(eedvQt!@!?VCcI{k}pBJ>G2lnNHU;_7DYX!3+#J;{YEBHWVVF(5?tv~X~P>1F>5`z zu3JMhyEhLZ@m>?y;^hcOFD8*LRdD2#g2aT&w*}Zp|5+#m`(veNWvCL5cMfh9R<#G zfe(nexh9+e%3U8x7;F-DT0^|y4g?w`!f}>~v%ME`Ax4^2v4=vqg3Wk;uxw}R>}KOR z@TgFEJu(xbQffon4AY)6ba9KvkAVo3S8k(y9_e&bnxnjY2@FV)oI0VUG$lXPVA{CTvFOvfv4xfC|EH32Lps$PVowVJ>(rT;yUF2&5d2k4`wk z6*PespwFpftHPvj`cTgLTqqjG24L1;6rw@#2ts>)XdxVe5yn6al;F9@&GImB{j>|m zI12tuk39&E{$BqDikw3Tp+E*OfI9lG{~C+b?B^(sMUB?z$`0rarsWNa>~R!s3&!r& zAP(&)aQNin7k*)bHc(wU@J>XK1WT|41p@GT0TsBf9=5>|Lc}v#aA9I_QyxY(7DD_S z5Aw+Gxi0VL(#^(1U<7dK5pih;pa2TyPdQ4$2ty(Za7j8~UbZo(3yy0 z3Z-m-XsQ6IU}q4hvXBW3zAy~EtnB#9n;_v3g0BLRrW}4@X~JO*RiO~(U>4eC@BS_h zosIgmp$-KC9WY}L1IAH8LsNbTViv-CXap4)ArLIW3Bb{=?rIz-u^eFqR<0;W>dz9n zE+h(vm*D?T4diDDn~(%9U=)!|j2;UIeBh;|jLPgwDcq=8^Z*Q&;0e4??8GnvJh~zH0!@n|gHIDwYZ!}h6+!_VII<(PW~x9k8Ah@o#Nit< z2_*+6hk8hEPzhpsA!5F#Mk)qJCSej(B`=DDiOi>Ce$r!Z$yPWj31|tUrh_`BF3Ccz zDWCt6CWtT$v~VD|@D12tG{L|+v{K=gfELN_%eaLMBeDVsOljccTvQ7$=0IHvsV&{o zUI1^NL=tXp!Na1#+hj<3aEJ>WVH6eu7?zVcVG=MM>OjP2M+~zNGKM&q2qfe~9RcSO zKgMu)X$ZXFBfUUTJH698p9lt0AY_PA4XC0#had$oU;~nJJwyME z$>1}xph?vX&SvbB4ZuJ0Y37iovI#Ei@|P(f)Yq7uvy z=HN~!!5Vav&QhpCE%ZWxvxhEa8319EI;psnU_@^Lh+r}>??P`@)G&nuMpY#{sRB%b zqzJ2k>DuQ=iZW4)WCMb9NR_g^j5Iu8#!Ec&;5-#4v_n6WsY+#S3*KNMJF6iN;UQV| zOT}!=;G~?4Y7!DG64G=Q)^s;F2u|Y^L%1eWM&V!tg2PJ8#E^@va7Yk%C>sMaH%LW% z3bRmSNtW_pmY`)S)=_Yt$Vghk=u+U9uC+X2U<2OG2QJ_q@v*%~jVOG=N`xGO6+OpO z4{kJ_G*p>@O09I(PPHp<5f@n%5&{AMA^8LZ5&!@IEC2ui0Qvw-0RRa90GnZg!N^Q1~#KwsJd3e%R+qeovYRLZoe(pCwTCS-N$R6?t#Oqr_6HLEF4p0tXs z>WM5^PngnTx}({RD;KPgm|2}J%tyn;Z78QLy zmV2hDn6gThYJRF%Q|Z^YufM;3Q~v2U6+)@-0!=v3fai-Z-1#z$cMUeUV0RKiCK+Xx zVbe`!o1NpCYS4&A5+$dlcF&2ey*As5wApssZoT;ioN%5T0tqFa>}Q`StE?glk39w% zCMsn=eAq3PF} zYgWW&n`^2`h?|Z0f(5_Tt2Fb`(O;Dmfmcn>zaY_{lSjc&${Esowp%_@`z zW2r5kWU8rVu5s!qZ7+%%V>pz`GYlj~{9we%?sBX0%EnT=t;?v!EA!0aenIoi)=F#b z&fTVJ?6u7Xo$Rn_)KRprb@ZAv(oFZkw9-g>0?nPi#Nr^Id+zIJpn(qBwJ!q~tk1#N zgaeMFV>5grHlm4?Nh%a;DtE>k%LXcL<=`zU$i{&G2FVpnr0T1ze)#d`;fNn@_~C=N ziMX4Nzu7pPgd{Sj<$on&x#eY|X(nD~I@Z`gbqzESmXy@R%HG>i?z!x-~+ET+i4sfu;qeYb9UgEN}nY}AocB9NSg<5}Ey@BR1S zhc7<&UvW=X`QKMXwwMJ{cF4mX`p}0uJPJ|&(z6Q~nxu$583wpD;riN63w z9cUcLGP{Tc6lqsLKN)aqzTk{43$0B%>uExS4tE0vw3~*$d-%Db3iUj?9Y<9%Z8r5Qfl?fQ+M!z`}}HOhX;3iA^`Z z>9O3L103&cWFvt|&w6&_o(#;8B{RwY&wf(lGSUboHKq~DQlc`T1-+$0Ye|e*Hk6iS z3+B~|DMdeVQHfcDkUq{~i+R*T9%a-}IM8^HV1y%4;E2UEqDQk9#0V1iYE z4_cz1c0tSnB8sE(m<(Gn^VWO+3`4H>I0wFhVOLMY!V})G*xcxrF`2Fiu(=6FEam|X zR*-WRnJKPuz3JG;4)q+0JgQ`Y>D2Bv5VM-)=RY?~RceHG7|m#gG0+>u_D<(&B3aNC z6BNJ#DzTzm%g%RZH;l2xf*rD@>`3RK4}BP;8i^{$ZhK2H+`?44ex+&NO7#lnrUFN- zFh(MK!^jRx)*6naq=+jC-p+1zl$`ynEN5v9^{zLH+X+ueb}>Zt6a^{niHTF}XFnwc zC_oB%1-=eM-}ahBJGIj<0_72lbI2C611_*JsFA3JeFqw!@C0h8+(EwfwRsW_EGy0*Tus)hWWqq)t zJiJYXmRTVU;SRUBJ_R#!hcRYpq=FDRA%tDF2fi$O!r0&IQkJ+!Y%i^4g&|4S8YL97|-|?$bBqVfq_-U z$~dz&Ztj(xds-&{znRK!cJftOYvV2Z0=ZQthfF|2-l3+qniaHUTXbVG<)Cag`YnxS z7z{iD$4`GzWRGj=71!C!ql>;N4OYmb8m34C%BC;{lv@i~84tUwf+Z}bC9Qg9H@mC` zSF5(`0cme{yY>1Yt3l|&?sw<*wi}lSZci>wgGfYQ0F!OOpUHEE=L_fJk_p!#DCeEt z&Wy*yAVjGV8$kbVH_oAIY8X9@F($?;e9MZZpUCMaIyi*$_*Xtw{pzQvgW#-JkwhHA zMxtxXmKc2{)~)VFyXO*GFoC7BAo|dkNOW4p$NcpTno3}KzVw|7ps;{N)`iBte%v!( z$XDkiI|mQ{T&Xb`c6>J+=a5H%tMU1Hg#NdyIBcSt-t?!lM)e7|&D29!W_DDA6@yR* zeNZ{sLrw`13iv}630Ob)6AMDN5O~%eJTzxNgcL49z5J#9#}V5P!KafAnW?_osTX5f8@& zSp5eMtN?7nmOZC&P*50!Q7BLdl~tuwURaogR7h1-C{R}DNd-k!(7=TO6;P)ng`uTN zzLZ|QQSefVv>>xdy=!C2=4U+hcp~x|O)ElZ8kFDs6 z_T*ic1y%bLRkyfVo%K&#D28dMhQPRnz(|bYFb!EGMbiO(e27F1Szyx8U(hIs>bDQ) zU_yyrHkf;O1H#@ zK$%|dRYg9C2}V++>cm7Y0W&I6C~$cnDGRI^x%B}QJ=@Q-F_MZUzFarhC`u|y?- zlp5GWch(f5v1dIdA9v;+yYN4S8Jzc(l!}Qcj2R1n$SCP|5BtClxS)Ox(>9p@nGiwv zU?VvXp~#k(IF?voNlI59tYKfkmLW<7Qo(lsB16Y7zv48`*Bt5Et@q-mz0e#|Ae2KrUC5Nczx-91!G{W+(%wl%Pl6G)cD|QE| z8{v2S>UUF$Ie#%}u~0UrMH<1$pGOp91$GXpa1S2^4sG?O!+H*Cx?9Fjr>}4d>9DMN zdQC%ko}ekMV|g3YDi6Uh2<*~z7e{+;vN(wYux}zKi8G}$8yMRE<~iBMq>j;~f?*eq zCKsdwq09H6&c=M#M<2rgVg>ts3G0we#Ej=)3b8d0vlXnHVGp(dO=46;#y|;$VG8H4 zm5lIqjKCGY> z^`RA0VHG@jKYk`3jQfCjHfQ`Z6yPxo5k-`dx1pf+kor&#sSsPIMh#Y5V7L%moPjTh z2o{DBwvecqFxr}*Ns`fuwtTdWk215KLgq9VDL-{_}CXoNHc4yPauwW|?$aS5mJiKdwj z4h&DGIgb)N!HX24-QW$gc#|Wx!5nNxxv7`A$dlzIpSC2FYFM8GIgl-u!X`YvVdZIO zDtQ>SbNa9k>T7D}a9QuW5Bd-ct(Fe4upPbiTfw!g-T1ofNRny$BIoc5&M*(dfC+w) zJqzp&AIqAn!Hy#fDh`|uGD%bu>`-9M+^i9;p5h43F)7Yx zJW1u1n^uU1ZTOQecD>eXru)*69H@aD7#@TF2@OE;L`(!8Fs)`9jSJFH5B9(g7(9!d zrw{d@Uiy5{32iBvKn={Cr$X4s(Co=~L%j3g44z=ow3ZI+@W2mz4(TAlVq6VFEn+1N zy7K7^1p$m}t-URcls?fCKD1+r%N2Typx)DHL(3&yVhUPf3IqFiMLC@3JAyTA55eFJ z&sdIh8PGSSMaLi@~ZQqs_o*cT-T~xCoZVUtyj=)mjDgjFe!;Cyvto+ z`XCa|JxN7f57ZD0B#O00aov^O4BE}Q&I;b09S=(kDuOi+)PM<0U@}JFF7eVc;?gZ9 zM=Tt--y!z}-%2dYB6B|uH0X-1r5dV1W90J6rAD*l!VTQM?JG{xsNi;`ZdWS<+YQZd z9ubbP9!TLNap97b;nl$5S}9ms#0o1)2*#k5d5Wh_*WH}Wj^JH{G_~R_{^Bu?sz#o1 zPi{S!TII6RsCppi8}V(0zOTIhU3+}jcZ&|CIs534-Z_WI7`H7K)wXDFfhClCC*ldi zo>raX0mues3(p8rlayFS?G3ij;es_9t56(}U<@3)8gI@Ta31HK-40u93>DVmY>+Bx zPa!JH5$$#j?O9Rn)E?~$cWQOVj{N&43r)%lmK(ED<$POs}&0KvO4L1*@ zNeBao7l@V%&LB!^EuT`T%DHLQ9Gvx954u{9^(M{ASy+bd{LaC6!a_-q1F1?86%HqF z$7qT~>JG@%zzX%S5AguqAsP?%Fqs`CWo={c3ZeHrPk-O-y14$xeAEnM<_)JXCwNg7 zSsV08?C(iT^tvt^0_?zC?8RN&#j+{ZV(eXItic=1^ZLU&HeN-J?9B^$-sgR$wQOL7TWAg3t3`IS=%3>(ET}C|>lSA`N%S z_)`q|-muXeZQ@D)9F{NA`JVqypD)Uxf5Bor`l!6Y{fPRnY)Y}TVhUx#gIO8FaMLZg z<+cy^;gS3Q=disG5Y?)68yC;szIm_M>C*>|)vjT-Af;l(DxN-j88vRSH_u}{kRa#9 z8yV8%Np>mIrKEN$9ynHs5<&9BN*c$F_jKy?`0?XOpz-9%OIcK9I;1O;raK4D=~JlS zygBvety@*A-L!Ta$W`Fiuh^)KC0o|)SZQgYK~uZd?c24@7YQ1u8ddB zCCo>VFqsPfHcvFpdl~Qb={e+0qeiW&)oRwQUcXWkc-CxM>~pot zHD;_?cksrBjVE8eJhX7(hVdO=*f3)FfA{Iz2kuoo$dU(wV|UQrt8^HuCYHl!V#SmG zZqsNadQR#oHFiLXFdm~?!$cmKAfd??a4@=Up4@ul4J3IaG-^2El2Yy|th55Fy6dpR z&KYO4^Deyb%FAU(TzbUC79eeTWk@24WaX8LK0D=_QwXwjyb*{$|2PzovtTHxDU;ARqDLdr=xMMdl732!LK9i51`?)T zd4v%ENLVpO8X6mI6g+2e#Bn@h1p7rWOoQ1mmmY%zvPe*y6jezjovd<7PfYP-)l@yf zKJA9(~54QIei*GFVZgpfppmAF`AiKX~hVwcr84UW_J;^U4(_SoYqKK|kglvAE! zF~Dy zJN1Ou-4TPL*CgWD85Aj7>X?~{l(+bTCrTkkL0cHZod z-FCZq=uN&`a*o-+p5r>w(D-|0Ek;&jizPPyd|(@9xM4!pcVA&hhN(tc0;$#9uuQXM zNS}FZp+F$nGrqJ1_*Sik@VL_FqEj|1}r!BS-^KrV??Ng^buhUBRry#h!-vIUQDp{Zaz z5>t}g9JT~w9%GDqZ%b6>_DSY%|K^5p)r@bY)3n6kp?yHa*l5N!WNzUq$RUeCVd3M z7*WI!=~77_X&3_|2|?g6K9Q(L+=N{j$>kYM0-Tq4q8e^|MEYpriC{#CUcp(-iI$QM zr=WB>D`gH=q=FTg#uTQ`X^wPU^r9Dyr5a_~sddoO&bqiWE^?6(b-+=MZUm!#{bb^p z09vUizQmvxsYf*w%D;Wu!WgMY6eNr>QCs42PZdoKYrx?NYQ!TL9YxfJ(lJpHWes;G z87WCuvy`W(l%*`1N=&1Z6`bajEc5dzHR=h}wX_8;LA571@EMW+U~sdaf#F;z8DflF z_yZx}n5sVN;f-K0t3hw(wbfcuz`h(`Ac2k;A2ZN|vdWMN9+dV+>qqb{?Fi z;z8?^3x?Q(k;5=8NF8X))w*_G>rjd(W?NfCVd4}wX&_h^Z(&M@chm^yYblUYInQV0t`mxBMn>BW3!#Dk1gmE&{)`ly@~QfE>xQ* ztH~EA?VxWuPGJn%LV}pNh=*eKkq=S&w<7>1Nl=0-oVybL*f=ZVD{{HAm7YSkoi(~q zj&#H$PIW4gh8$9oh?HXVa48m%?dByXTgkt8ZXeVLF=WWw4f6tTx1&t)iVtLq7kk8N zt(9>+=*x~)d=bY1|;+_2uPgbkcgyqwLMj&BN>U1gbZZ2m*grQzKYbRW*7-ah`x&1ZF`C{ z8Q&0xvY8p-39smev|i0k4L21r!SL}uyn*L$t*Jl%`-q1vPN$F31|}B6uE>kyi)^|o z8%Xvr#v`skwk;%UZp?C4vy`QWH*{PNeGqxcM^18&>mgYx*Le53H@TNXF6MV@9J^0e zy^}4DaqZr@^>S{#kUegDS75^~>J8agM>gM}w3cA{4Gx2&N!Q^TxIJvqj_)=t7`A8x zMLb~}+6{TGeMTd_o@ozfJi-V%V7ttc_q^v(uWcf8UfO8xIK_=j?|H|bva$z0z>Du< z=q7xyNGL}a#?V&7WSEXoTkowaJ>QZo%;vPEm~<$_AM;3)z}u9L`8Y%C!Dz%M4g_{F zj-BlE3P!QhJ_RFSd<$&oc(7D`d)((<_Ygb()Cy^6D;?(w_~gdbxMu|`T7^5@;C_{> z?D#K%P019jNX09t5e{rb9@er(vtjzp4gd`;9bXZb)yMJS(Ko^quYiO>{L5!#qcK9k zIE6l(fr*iIFgD{Jx2q`e|NrxZrvV~aX+An~zC9Y4ZzC9QYd|JBl59f~Pn$MH`V=9t zHXqTlP2&`$Ylif&H!@o~?rN%jlZRFS2k|qSfzyXv0EhXYhSA%QLvX+M+B1j)31#CV zeV_(RNR~eE6`GK?3bZy`m<1y&!dVc7P1pochy^2@g;;39UFea(P^Rq?3~4)Z!xF=KdJD3+r*g=?Sg6BKs-$bd7Cn50 z(2*h)M4Ek2n)x`FM=HdN@Gmm59f%W-b})uU!$J!Pa|>#K z273yJbJ)eL^F>d(Lop!}AG13DC^ANaLdF8phjeJ2+VTWjAcO#c#v7cVcrXS`*g;QN zwGCN^e)BOP8?tcd1#?sbG`LAPK!cow12yQ$oV>}NRD(z$h7yT~k=iAEq{O6ftR+iD znQ}!~#Hq0m3xX^xgV`|qJ{8k0iTuj=&@9EUNK+y&RMJQ+;>gx%woC}gw|YO@ zQN4;vC22^>YVd?ZkqthC$$rxZbs)!CXvdz+0xZA+oxDlJEXM8n^)(I0D1GNynrC z8hFgdqyZPm&LdC*X^1!zNlK-}E0$Wtu9%MIDho8E5gXwS@bD(_h)?qvk7l?FYS@Kd zyh5h)B-ae6fs!J#G_Qo3k9c4OAhE{X1S8%uws_c$8w^fJm^a!{D4?_)me-EUBWRa~L3L;5Yu!A_bKQ)e$m9 zY!LXH%XpxMN60AuAbbTfq!C6T24diaoCHx9DA5qOQxkOo>3qx(ty2>qf$n@v5oLiV zXahe07$#|jA!UVDa6sl$zTaCP7K#{QdA4CO7QoXU?FpH=fgCoNJ)>*V_K?V54936s zPpBd|*`y3rss=8dhZKv2FNFkY_(s)AM0HP{Kv{&=#%J z5cq%(z|#^fQ4xh!5d~B|#Q_so))2q}7Qg`?@PU%q81I=m$*DP;L!7+%xpOTXbzN7! zakq9&875$ZC8dV-u%CPbMm%gy4NX<4n$0$%k8D6MeV_**kyTGf6imP(->jN4t*Bis z8c5jHQ%D2<;;C4gX@gCeQ|JuQWxW88ZPq)zQ;)p>kQGsrRn`xv01IFN6aWF2^#Blv z0Uh`OA4nddySug79-U2tjRQQN^+90*7K$l6!~+&cXa**2s4)3OuoM%2@Wv0zg?ex^ z()rhV00)63*aU4aW3W{*+A}hhuU)O6m6%xKF@nIUn@CWD!gS0Ky;hI40J$C6xP5>J zumFz@0TZRxYxMvMcmNLwTo0%K!F5>>U;&!Ff;x~RbXy^Z83f;p)Yy<*T~Qe1E5KQy zl~T)GTnQNK3kOlPpNMQa4m(w--3MF4HM0bVcA$@Ra50Q%y;UeJ7UQ>t)f4!NM%Nl! zaCn6OacGBAr~{K>7D70LNZ14{00Oslfjj*GxqV*fm0P>TTapD?6JP-o7+eQ%fC``h z2%rG)r2xVu+`|2VE$9Q;cvR)1qXPt(=1ahWaS|yhmCx9=Y_kPiFotdbUHyc}(X}K{ zdRiZ=hF9>c@v7Q^le5@mh1nIh&%gz*4Z9c%iG~e|bZ7@~fCO&<-e64@Af$v%Py-;i zfsJKeW{qAHp5BkW0K5%Z3)tT6g#ZIkfbSLG3b)Wl|^P`o?Z*MTfD{F z4{%vzrT{@^00vNi0m$YAU;qcufbNB12T0_=)qy?;25>+M13NCNkSQwqOy;7FNqew% zDvP@)hjWmIPrgFRDqX`MWyOGrdGLpOQ04Nv3|nwzd)N$G*g6C8gda0Du&v<#GeXK; zP6%IapG-&vQB;E?7*rO}TNC(z3$WW8et-(FTV`fvyw&4r7Gwob00u~a0T2LfR)BB@ z-*CQZ92VRkAcSB*C8l_^1AEGwipBLD&7zu0yf_DF_>m_y)nJ@bekkRR3}|~GXjD1~ zf(1RzV1+T;1@%*xhpxeh1__CdxRk&I95WPO$%IcB24s)~G#Fv#z20keUXmv1?M-QC zeqOtE077nnmrei#5CFrb=>&iP2mogo4&NINToCwyIZVpPectDZwBn)J7K=zhgVO32M8B^N>qnqvJAto=KI_*)N>BJIwx)^yU9g5uU|T#6 zfoNUUW=3gnMrjqk06l(y7+wIFR)7SM>BBZ`0$>2eX6%~=-^Ui*7`OsR$c1V^XR45j zCL`*ol*JpBks5JN_@qxt@s0}%ZBQ;%Gz-hqCOB4L2l1P_tZtxO$OZv9g)z&8N2rNM z(1(10%i0!Oq&$US_>a6~g>WDSxprG(&g0_#YZyju=mmia*xm{d?7=4N={D>ENPq^o z?&}8U@J(bL)`2g`?e^5sEL^5dp{8gGl~GBODp3_vSU%@N+GhCVr}mk@_=o%6!*o#X z@%54+Lee|p@|tEzuVc!xj1?4h9MX2C-s@Z zK=M*fh$X-307?gXn2%tnRegYoDPO-dm2Es(aEHY~G+GG+)rXLrJw4z=#%xRr$KEq% zZpNNo>lSwZV7K!+&+Z&9+!*))cXc{_)d9504T*wwA&-4aL9nCtWf}oE` z!8`=js+)%dY7q5N-+5g!%CbudTbSiwAcQM;0y(f_KCM%foqFsZcngqb<{o&0f9V-s z_^lU!0?1|>2Kzd1{bAQ>^3`7M^#B;Zm0i)08!A5k9Fh&oJwE7r-&KhcClO-&^}ulG zc3F$0ypIng$GUU>`+5A+ zmd5p3e`b?r|2KzohL`iyuW7J{_+StF#TMsp7Gw$l2n{8eJYw~VmBCjE7rwIPu%W|T zxp3K%XfYVZj2eRtGv?7_vyjrLbvp;H8Ln5uHU`^;F_+6-GH24<_0M0tef#tob5?I( zJaE*ic^el`-#%)&kj8`93=!NLR!79T9|ec<3PU2;DHAVhbvHMpdbNc$O0x)rd(hEX2=X6 zG=SjQbA!&GMN=qU;WPyZ3>bul;NizqYSL!Yu5H_yGikVU@3vigH}2WFM-By-?qtf9 zGBGZ18PmB;Tr-2+w5L;_Gh;u4W~-LXsJ?pDa#@e(&=xdLQ85{-n)SWauJXsy|60~8 zTD5E;!IdPp?hPh{00Ib#`4t#~7JP64Uk0950R)dlmOufORdyL>10=B7XB~P78UzlM zHlk_@n7A1QG1Os;9954uwpcgMdFe&}3p2G{}%1lE893Vx871r9uLnggLtIKX5TT8Lq08+s_(ho6z?83Pg~ zpa5$W7;(yrFveI-jj7s*FmhH0jmHn5qekui{BAI^01;;E{tI@_wOLVRjB$IWWXN*gs- z6Ld83T9r=J*s_m5^rYirmGM~rmyWW`2IG)1tbF+jwO3VpEw-e*=i&OoA% zG>|Bwh`Bhpz(St~{`uFt?<(5hq6AjpKm`Nmt8b)~4uF8A0Cy-hXsd13>4cC$K!FEW z1XJvesrm*SZXelwx81`u<4rfS#CH zO3a5u%L+f%;+*r&YsT~QSw-6;4JMJOac&47_$gRmQA}wI^Ek@jNWKrtIoV^(Dr^BjNOaE=o%5VlK&P{w*~e%2DcU@y z;fY9OVNW3#&|dr!HK+wj0kh-F)fhDx#x#HcyGsD13Lq(c@k>J+`isDf_nG9K$V6$= zOal;6Mfp@K(s)x8lO-@o=hOG z0$Jc{8+@0EJP0okju0@3T0mqFU>Ox&MgT43*QWv&8X2l4d7tW(@*v|c2*h9traUDR zQmM*Sva*$_G(sx>O{vN$ymE@wcp3V%sLL&C5sQY?r5D5KkNJ(m6ZA+NJ5c5g$??NH z?AVDj0{AjQctU3G@m!hi$g?&53_s~8T0E+;iq*NGbqab=yQJ2xL@rV>e|ZpL9so(m zNV01K@Y*F^2(Wzu3{;8y=M6Wsnzb1ri3UBWL5rwRA_}pgLi`~R2jL8A1VbScp~x;X zdZd{YPK&%soKD!`iFhOqjYMI`vgnbEXA+GSwwPu$F;T}d*+ZM6+hge<(GF{ff}G|w z5TF7DmoeQWy?H;5UzRWWL^|VYrFKH=FddP;Nw4w6+wVDQ~Xb?Q);UK&kRbRQ~B$4;c- z(wD`N6_ij}9czlMn>w&8XGsS&9>I=qh$0I#DCb@(a3FQYZUF``K%nCF0T8$jskCcq z3Mms+sVabzAX-~$&^Doeddh5_+>8-0k%-|w;t|9xE^?Er+($qH65<120kIbhRK<0! z=dmkxcj=Gn=p-JYNCz^j!49Dm)*iV4$4;oR*kCl)6YPkrWG8#mZr+Djj~ItFHc>&) zik5@$I?y^#D^v@F051XxL4ztVPXzQ%02P{Th7bU@4e>KHBFgOzc`G60A&&x>$i?&^ zavs9}S+^q4V+lq&;*s1CMJWcM2wk;U*X(9=yCAK{JXiq^f9NBb-Y|wV(y=Ui1OvVL zVBAZ8(cW~xm!@Z$FMZe1j&yhf65vP%AnlUD(F#>vf=T3QJ*cP;6xakV0IdZYU;qMO zW`&lVt%M~U8Q~SLHGqjwKohxJew_p zp8{n7-ln!N1wOM0Ku`e#B!JELv`{`J{Iv;xa%{$fp>8vr)f1Ub0Wok!HXIhQKo6S# zH-@H-U|q~;N0a-y*tPMpm}LuU^eUXEN=HuELX9zoVimI>#vv#Xt!kWlEAd4Wl-u-b za6p0>n*f3ff^DEbF+A4_2(yV$yT}WgKtT2?Hox|DNjb|IGMynFhzNCO2299=yG!=-uFBg!PU?7um+0NFf%=XNkKl7K=;Q3Jj-7|+7aEg|@ zTw;Unc5on;Xo}kW<~X0RcB_LFA{*o9rxLoHoPn%RI0WfRmj=@jm@~?zCmZ~dXUvT{K z2sEI9fEMogb?sW>p=THEzKro@VWspOHS}ZH5fznxm3?(ADCQ|lf}p9 z%m-O;OIfUgtAT?k;0axn6N9YZpFEr*mDUFFg#(?prA=DBbR2C}H6)?dRQlRl&AOPftKJY^}1jCk? zpfNO;%s|O|bVUn3o#=GatK}CQl#6HKAP6u>A=%oO^ zAVtii;ft^#KY&9pEXzE!!Yl|7BxnvKOv@emn^ydr9ztE4j6*VP0vy1B6yOQ^T~NY> z03qgDQT1A);99%fOHnDn5kg9`FP-oZ~$dMchN#YIF9sx4{KnYNxJwlWo=z$OE zV;%6L5A{JEeAN#5&|67EF0?`{($y>~H z&D>#4d7oEMUet{PGDyNSPNNijR>f_eHZGhx5k`U7noyOVi2x6SO~%IMpY3&u3=xmk zIMq%*Apt5t35*pXgw=4d)o>+31UBVb8JANU*8?^eB-lbV7^Fcs+CtLeM}dr!tObsN z!;37FJ@CUtrj$lvjwcWTD`WyI7#0hXiJ44RSTK+tRn~YRgC(FO8c-wpnE(kS+=Ap_ zu3cE65E4*DjSWd+@9g9x4q$DG2DH)BBuZ6Ja*6_I048+*PXb=gDIkPsj^=1u&qBBq zM5xa&NJBShWnCd3M2MI|oJTBtWnWQ)SlR7NH(33QR;JNuXGuul1|xC6s76w`zO4|FR$0@`FuPitrm^-i2g21 zL-LgS=UfZDQYC)`6vk(mp5M8z5p5)Mye=vN)C~Lx^}@{qV9-jlJ=w7kY#?`Uo}H0< zb=ky!HB~_t>C(P|xJU~bJWlygBtqTT9_?w5HdgaDzbRg>6`OQXrSAgF-0%0uG`6L}*2ukkCnBvvZ{FQb zCR!#bRT`O2)EOzSDJHD{i5-@k0iPBtEP)>tMg)~uH&rMgvE(5cN!h4CsIA!MkCeN| z9w3D?@#=XhG$oISEUp{Osf!@^X_i*J+v>8ccpWeFHeZOd+Ar|V zL?GAu{IT?RtM4Lsn6$NMi)HgqKXEBqU`G+K!TFn0JW7`7V3j<5_I1$@@aE0x)BiO;C3!YZaXf!KD??6$(12=ij&OFzlfMQ>t3~Se9UaOZ^pzIiC zZ(FyMMdOELVu$pJh5xf68ZW0z*da?R`V+MiB zXA$5eFXf5w$E|!cUQ9%K(xXy7Gp#=bX=75V8-L&FJn*2?^1NFbjA;00D>J^+m!*aEM?M3#_gTLhV`(Rq^|Dyo4@VBi5+Q zkVM{10K5oL^QI$1d(7eI1HDm^UbBe2S^g$srruZOf5NM5RnIcENb;%T@@HP4!o`f< zsmj|WerEg3JTCpCBZ5^c!*I=L^~k-GL}a%HJNgg%z8Ku$oYj5SSied%c^tXjxnPWytv2K-G|pC&Eb7*(RNKm_SDSP5 z$WC&!P7?43dSeervSyHe9Cs|h9}bb5$DiFC!cKsMv}x>glICX>HjFyi1CYA<{&ni6 zj1&i3`&G#*zb{5&vZ^G`rM(Pq$nQ#YW@oawh4D3XlG=Y8>MTvO$|FUt-|Wy}rRBpc zlDWYjvg)$0ZYYr3UK9&XpZ_$W%F${$-`#=*Q)yv1Zb6W(CN2 zNW1phW&Y~E!jX0NxmGQ#M^0gyVQfh$NJkR4a-&g=+KgaL{obmoqeC(lBhbozr?Bh; zc&JpKKY%+Iaj;-~2?yok7B1Nu7+x}PIgPrAqd-`m;|4aDSmk6b4__Ohzr6hEr%tWf zjJu6vz1ux?_hgBv;%W0ZHhpye&#tjXj}c|*I4c6IXA-OtY-#&MJ|$}Hl*{^I)Xh88 zX{+Pp%1xyK^{qrlJ|jUPAj^^+uPl&f2jh`gQYxARrcgO85(g?Tc(Blz zmaSt$C-#0mN)zg%j2~47!PxLPL?!vi>c`Cwx8M0Es~%pp&L#Hn={~&p;Gq`cV=`0U zKpkdTrz${GEk`(-bA9_Kg?!sZFGK7Z`y2F_jigCRZ#DPt^Uj3OruqJ&E# z*+4(xnnhNRr=F#Kim=k4pk*^xWm#ivOZ z%DKh2-s<)OHkDWOjoCOw<|Bn(6(WfN}YgsmiEO?J3SD%Z1Y!f^FOVE-zM1pI2 zv&H3W0EJ%P(v7pdF0%D55$b}a-bU!L>+ra=-OJ_u9m_d}_7O@RI}y039yqXZC$mF$ zv;Ohy-QA84v(=G5Vi%o26AAkO2#>$^ z&@9rZUk$>9+QQb&`RZBHV@;X!S2%+NdwR{p(rbBx{`}=*oRFa3UzL*Clw*mZgZRa9 z7h$`p#hZt<%|qeKy_wKPFzRjxAlE_E3IODLtcI zU$Y8#zB3?|Yq+$4ODao%yQQCw)T>|?92S@Y7yLl+zV_Y}A=$ECrDc-2YZ~p4EkGi^ z_v+F)at@iflUm-r=z4>A>we_#OQBsJ+UN~|gxJOO>F&|8EVYh6zlaYnf<#@rfF4U1 zEKo1GW3p}II{Y_7ey#_;-sUO{SwfiHmdIK1FN?bK+W74R*)S;uS~%eg=TnTOf*R(- zg1xgP<&}n;?YmwPV(~&RPIX1^4J31^>^Cm;Ols=wojiP%`g^ahHupw&=9V} z06AW~Fv7j{#j(y2lNS(TENf?IU}A|3%R)G&_xJo`a>+yXf3r!A8PBXj!M!jWyuj;p z!8et!jJE%Nx`cJESRV5+c)ZGXdAZvZ`)7=edi!$3?}<_MDJM4jT{Qw`pQj3tq&^UEB$w);85Cf-u!fw^F zMG=x?O`cuamle#&!%86csd8gxn#P(B;*_InPt+>SjXyoC(|I#2=G^g3{@Xs%Z@Dz} znEHZ!2x=^_zBeddB-+M9j zQ%)iCYT5JYL-T2u=p0xmJpdTDok@saWrF=mQrsnh`6ThoS`t8JcO(djUAsun4%7&_ zUQix`)EL!U;SiUSyK5-UiRTR!4?R&|s9`s1GPOM=7O1E5A*9glR1?F#Yr;1Mr_eo3 zimz^?qkraP<~b* zdldzO3dTa@YQzxgI2w7wJyADd&EE0xw!h4$ax(`8)6<_u_S$a?%MMMn^j~KLpMA?+ z2H#^M6w4bnGpn{**@%u&MqNLyE+(FL5unL(=q&`f_PjCTSRpDDi@b4l8|yN>@=RQQ zfdqXX_5oGZZ+Zr&3j35PhO7akNRluR*(M;HIfe!`Vvt$%iS~pn3xBz{EBaBC*eqW_ zpw_3t=Q($J^lB}G;3d+*zF=zg(~S8s9|8Ixpo^*DhZ6ZNrlQb z0U+}J=5wt4b3!vAT4H%gs80C2()D~1|3mS{mrWeDQV^$*BKTdS%zT&X(2E`cRaQg2 z0E=wQy(zHz!*;iS$j2%2;%FNfxkN7S&iL?8Y32^Z| z2;X?(^EacKLJKv%8q2I9DA@;fiMv}CclBZgA3ft(c^!W3Kf#p)%~UmKw9D?pJGvdk zR))k1HrJk{m*+>XmY!~hudDMYh18Bv#C)>-UZo_onRMJa{J|H179Wh6nui8s-l4|D z9^6Vz%2F+FBix#F+v9%)KBiznQNpCR@@a|fmeWY59DyfC1d_50_UKp&LhDf`P2DtTnG zv)!tb2q)JKD@SEh$LyUZ5ixWPOqPZmX80xLDRwyaK%jSCak{ixVT9G2I8 zl}9qvFf&Vp5aH1~E3lLOXCn{xp@ti`iXy9Wd<%WdAi{$&kO>y3QO)>PE&=&s{e&kU zs85BfPYYc8$gJM_pV72dSH55f8IeGw*6j1tQ{?K0<(l@n@B7kxQ+U)ic=VcUT@wWr zXV9Li?(RVD6|nW^&He>!T@hQy`M|@8FBsnlro&ynl>A4UVsCO(`T5q=suAMsoC0CY zbNeYkBBy045UP{KXF8fDJy|DFJ%A||00B>ar28j-}r!-c-=!|lwvEM9=$%9T`}`<{u_ z>NpTc{K!I1nw%=o?!d5Z*aF2Uz;kDW&z+Ix%a*1E34q2Uqrb)hsIEZ_A#> z5*P-HNGIoeZbLy%)W>e#^R>K=bNnyQXr5#H8CY1*Hl;afsr4G4a(!N8R}7s4bZzm` z=2+z}*vg=M79IG~-kT$oUVFCwivEQ(G77-lQ^@0f>AAj){t16Qer6QJ%qdR)_PyUy zQr!s5MSC|9vXVzPgTlg4(#-1_-1mmha;QlEJZ%-@TSw|}ms#+)eSFdCO0zroBVuN9 z6c$_ z59dkc854BwI*#p8%71Qe5Gj05{4{+n^7Tq9;|1<$m9MBsq;!FAR=!xZ0h`(yDBvL z`i$9r9w81%u(waNe|}(p&hh>C+k{*(K1pdm2(!@1&ZnH*w_CkV{7|r3+7s>cxW~yS4MMP@k3Dd1=8h?y1iIP*-5oW~+^w5%iwS^bW!S@{|dOnk1lJ!CT0SGk& zJ3<{_%kx4vX~N6+J9)KUmKcyY$(Y+DP>Jz?M1<#H5L3}ko5e9ZN9WV%p#oAc*Y5ei zhfUa8oh?fu*nSfxox+7gT>%pOu4wYVG$%*XT55UWjlx~Pp)&;0sEcieiGC@zwS%>g z5^gVBl#Y{YKm}CDB=PF*TEO#G>wp;Gi6Jj+V?Xd*keKe(^OyZhZ)tM+9WlAD%@Nj2 zdH5okR-Hb4Gf*>i&eL4{zTnnhkcv#zvs{TMTxRIi}w5I^7%GxZ}k z?}wwZeG{katZaYus%H974x~_$f{~l9k+0~()`&C6k zmV_8WD^5mfkIkt&I8FVk(Ew_u-0CS7!%7=>Dt3^CK^@8idHQ2`t3$l-j8*RDwQtL{ z0dzWQPv#baKj7yzR0Qj3{xOs!N`(|)2D#?(Tw&jpJ%E_fC)#mjCvvhCQSs_M^}DRa z0gz_JgT_!^?q5=8J${!;Y+I(?gJI9|%3H$ES_dk8jY;^f);?LG5UXxmSn0q&by(wSzFsxcOe{zG z#3-Lt>I+@fsrES5_1F0|wOS2MQ(U51N2$`qpU7S=%V*asknjHYJM6_4VZdU0aI;TjvdlGY?adv=te^vJ5C4=*4|HX zx$P&A;#c4r7^io#wHOWZ=_OkUmC>tE4U0uZORX!{&F-$q}!s9ww@m>*!U{c998t!RMvs#)V)R|i;RLyqpPLwWR;YY{J$#Ex_SECCL;unm)C8z$1>�U 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