Repository navigation
Commit c22b2ce
feat: independent social posts, workspace analytics and media editing (#374)
* docs: design workspace follower analytics
* docs: plan LinkedIn follower analytics v2
* docs: add workspace post analytics design
* docs: expand workspace analytics reporting design
* docs: plan persisted per-post analytics
* docs: add Pinterest post metric catalog
* docs: clarify YouTube post analytics
* docs: audit Buffer per-post metrics
* docs: narrow analytics v1 platform scope
* docs: plan native post history import
* docs: plan workspace analytics backfill
* docs: finalize workspace analytics implementation plan
* feat: add workspace analytics schema
* feat: persist analytics observations
* feat: collect normalized follower snapshots
* feat: schedule resilient follower analytics
* feat: reconcile analytics publications
* feat: collect Meta publication history
* feat: discover media network publications
* feat: discover open network publications
* feat: backfill native analytics through jobs
* feat: normalize publication analytics metrics
* feat: schedule persisted publication metrics
* feat: query workspace analytics reports
* feat: read analytics exclusively from database
* feat: add workspace analytics dashboard
* feat: persist individual publication analytics
* chore: prepare workspace analytics operations
* test: verify analytics across databases and browser flows
* fix: resume failed analytics backfill from checkpoint
* docs: record analytics execution status
* fix: keep analytics permission failures from disconnecting accounts
* fix: complete Pinterest analytics pagination without date ordering
* fix: persist recent YouTube video metrics before Analytics catches up
* Mark X backfill limited at timeline cap
* Resume analytics when connected account is reactivated
* Document full analytics branch regression run
* feat: finish workspace analytics backfill and dashboard
* refactor analytics sync and dashboard aggregation
* refactor: harden analytics collection and remove duplicate reads
* Localize workspace analytics detail and number formatting
* fix: complete analytics translations and localize chart tooltips
* Fix analytics backfill recovery and publication metrics gaps
* fix analytics backfill retries and persisted metrics compatibility
* use full-width layout for analytics dashboard
* reorder workspace analytics sections
* Default posts analytics chart to bar mode
* Align workspace analytics with app layout
* Fix duplicate scrolling on full-width analytics layout
* Preserve bottom spacing after analytics charts
* Fix paid workspace analytics backfill rollout
* Fix analytics retry, recovery and dashboard refresh edge cases
* Fix workspace analytics page title localization
* Separate one-time analytics rollout from daily discovery
* Add 'antigravity' to agents list in boost.json
* Use Cashier active scope for analytics rollout eligibility
* Use Cashier subscription status for analytics rollout
* Format analytics model fillable arrays consistently
* Serve persisted post metrics without legacy adapters
* Route TryPost analytics details by post ID
* Refactor analytics reads into existing actions
* Refactor analytics collection and business actions
* Split follower finalization into per-account jobs
* fix: keep analytics jobs reserved past their timeout
* refactor: express inclusive analytics date ranges with Carbon
* refactor: use Carbon for TikTok video lookup cutoff
* docs: update AGENTS.md with frontend, Inertia SSR, dialog, AI agents, and system AI guidelines
* refactor analytics to project conventions
* test analytics metrics without JSON key order
* Fix analytics date presets and report conventions
* Refactor follower collectors to use abstract base
* Replace remaining analytics collector interfaces with base classes
* Expose workspace analytics in API and MCP
* fix: restore database queue retry default
* refactor: name workspace analytics charts by purpose
* fix: update beanstalkd queue retry_after default to 90 seconds
* refactor: centralize analytics frontend types
* docs: plan independent social posts refactor
* feat(posts): validate per-account compositions
* feat(posts): create independent destination posts
* feat(posts): edit one account post
* feat(posts): expose independent batch creation in API and MCP
* feat(posts): add independent composer and legacy active split
* fix(posts): preserve legacy drafts and validate one-target updates
* fix(posts): match composer preview and scheduling flow
* Move AI post writing into composer assistant
* Open post composer globally and consolidate posts navigation
* Port Connect visual design onto independent posts branch
* Use slide-over for webhook creation
* Use slide-overs for signature and label creation
* Standardize cancel before dialog actions
* Show webhook events as checkboxes in create sheet
* Restore signature and label header icons
* Move signature and label controls into page headers
* Polish post composer channel selection and controls
* Keep composer channel picker anchored during selection
* Reuse existing phone previews in post composer
* Present post composer as a wide slide-over
* feat: manage signatures in post composer popover
* refactor: edit signatures in a slide-over
* feat: move post comments to realtime post notes
* working on new ui
* feat(posts): improve Instagram media editing in composer
* fix: restore localization and affected backend tests
* fix(posts): show video thumbnails in composer
* fix: remove Instagram global aspect ratio control
* feat: create & schedule flow overhaul
- Publish page: queue lists every scheduled post (empty slots only when the
queue is empty), drafts/sent tabs, post details, labels picker on cards,
plain confirmation for post deletion
- Composer: per-channel settings, media tray, templates, media imports
(Google Drive, Google Photos, Canva), alt text, posting actions
- Create module: ideas board/gallery, templates and RSS feeds with
local-state dialogs and lazy explore directory
- Channels: connect flows with platform logos, posting goal dialog as the
success screen, Telegram deep link from config, Pinterest boards
- Sidebar: command palette, channel list scrolls on its own, channel reorder
- Label filters drive column and queue counts; deleted labels are rejected
- Tests for all of the above on PostgreSQL and MySQL
* feat: approvals, external posts import, grid and publish polish
- Member permissions (is_admin / requires_approval) replace workspace roles
- Post approvals: pending status, Approvals tab, approve/reject on web, API and MCP, Collaboration emails
- Import posts published natively on the networks (incl. Instagram stories) into Sent with media and metrics
- Disconnecting a channel deletes its posts; purge commands for orphans and imports
- Post groups and recurring posts
- Instagram grid view, reusable media lightbox and ChannelAvatar component
- Remove the standalone post page in favour of the post details dialog
- Rename the Analytics page to Insights; metrics band per content type and network
- Follower and post insights include today's UTC readings for users west of UTC
- Webhook create dialog, MCP settings redesign, publish empty states
* feat: time zones, time preferences and channel queue slots
- Time format is 12h or 24h only (users.time_format NOT NULL, backfilled per language)
- New signups (email, Google, GitHub) detect time zone, week start and clock from the browser
- Weekly goal and Insights weekly buckets follow the viewer's week start
- Emails render times in the recipient's zone and clock (approval, post at risk)
- The frontend never shows times in the browser zone; display-zone helper for notes and tooltips
- Composer uses the channel zone (user zone for mixed channels), keeps the instant, slot shortcuts
- Calendar clicks open the composer at the clicked instant; confirm before changing a channel zone
- Notification preferences save on their own
- Channel queue: free slots interleaved with posts, drag any scheduled post onto a slot,
queued posts keep their slots, "+ New" opens at the slot, pending approvals reserve their slot
- Insights export, sync status, column picker and sorting; post notes without replies/reactions
- Remove the never-rendered date range presets
* feat: composer network options, release tooling and analytics fixes
Composer
- Shared step plus per-network cards (channel-list order, back confirmation), per-account settings inside each card
- YouTube: title, fixed categories, visibility, license, notify/embed/made for kids, AI-generated; post text is the description
- Instagram: AI-generated label, share to feed, 5-hashtag limit at save time (stories exempt)
- X: per-account limit (25000 for paid tiers); posts.content widened to mediumText
- Threads: ghost post and topic tag; Mastodon: content warning
- Editable link-preview card in the editor (drop, replace with media)
- Google Business redesign; Pinterest type derived from media
- Thread replies for Mastodon and Bluesky with checkpointed, resumable publishing
- Unified time zone picker with suggestions; disconnected dot on every channel avatar
- Failed posts live in Sent with a failure reason popover; standard auth forms
Release
- release:trypost-2 runs purge, split (one post per network, settled history included), parallel media adoption, channel posting defaults, analytics backfill and audit
- One-off commands moved to app/Console/Commands/Scripts
Analytics
- YouTube token refresh, Mastodon public reads, Facebook partial reads, Pinterest v5 metrics, engagement rate everywhere, per-network metric sets
Other
- Google Business is no longer a repurpose destination
- Tests no longer reach live APIs when creating Mastodon accounts
* feat: settings redesign, empty states, composer pickers and live fixes
Settings
- Centered first-use empty states with illustrations for labels, signatures, channels, webhooks and API keys (hasData from the database, never from the search)
- New list rows for labels, signatures, webhooks and API keys with a single actions menu; API keys show active, expiring soon or expired
- Webhook details keep the deliveries list and inline detail in the new design; create/edit dialogs share one events picker with select all
- Disconnect channel dialog with refresh connection; labels and signatures return back() with form requests
- One-line page descriptions in every locale (SettingsDescriptionTest); SettingsLayout centered mode
App
- Calendar post popover reusing the timeline card, week cards with text, posting slot chips with Tabler icons
- Composer uses the shared label filter (create label inline), empty channel picker and connect button, preview illustration
- Sidebar: empty channels shortcuts, user menu with workspace/preferences/help sections and app status, RTL menus
- Insights: placeholder without connected channels, sticky header, date range presets, empty state
- Welcome state on Publish, weekly goal popover, language suggestion from the browser
- Named template handlers, Tabler icons for signatures, standard dialog close button and toast design
Fixes
- Webhook deliveries no longer duplicate on live updates (matchOn data.id)
- Tests no longer hit live APIs when creating Mastodon accounts
* feat: threads with per-post media, onboarding redesign and composer polish
- Threads (X, Bluesky, Mastodon): X threads, per-post media validated by each
network's reply content type, connected composer with keyboard navigation,
toolbar and drop zone on the active post, preview follows the active post,
thread viewer in post details in the X pattern
- X: AI-generated flag, verified badge on the channel avatar and previews
- Onboarding redesign (persona/goals, header, no connect step), referral source
survey in the app, new logo
- Labels picker creates labels inline; consistent pt-BR copy
- Publishing status strip, failed posts no longer deletable, move scheduled
posts back to drafts, Threads text-post container wait
- Shared dialog footer style and connect popup header
* feat: insights post details in place, dialog and card footer design, wider composer
- Insights: post and network-only publication details open in a dialog on the
page (channel performance table and top posts); performance lists the top 50
- Dialog footers: alert dialogs, media editor and post details share the muted
rounded footer; post cards in every schedule tab use it too
- Post details: thread viewer in the X pattern with verified badges, metrics
band like the sent cards; drafts tab drops the draft badge
- Verified badge component on the channel avatar and network previews
- Wider post composer and preview column
* feat: image editor polish, tiktok settings, publish redirects and event time field
- Image editor: crop frame and handles, filter intensity, slider fill, same-origin media file route so edits apply on any storage
- TikTok: content type derived from media, no mixed media, checkbox options, black preview backdrop
- YouTube: title required without text, warning in the composer
- Media tray: live drag preview, smaller tile actions with tooltips
- Publish and schedule actions redirect to the queue tab, drafts to the drafts tab
- Recurrence dialog uses the shadcn Select
- Disconnect channel dialog shows the copyable keyword
- Google Business: narrower button select, event times follow the user clock
* feat: dark mode surfaces, facebook story photos and collage preview, aspect ratio removal
- Dark mode: raised dialog surface, retuned tokens, idea board, connect dialog frame, insights, sidebar new menu and connect shortcuts, tooltip keys
- Facebook and Instagram publish images at their own ratio; meta.aspect_ratio removed with a migration
- Facebook stories accept photos (fitted into the 9:16 frame, published through photo_stories)
- Facebook preview lays several photos out as the feed collage
- Publishing status strip, tabs header padding on create and insights, repurpose empty state
- Shared CharacterCounter for composer and YouTube counters, weekly calendar by default
* chore: remove temporary dark mode screenshot test
* fix: idea assistant buttons only open the sidebar
* feat: repurpose pages redesign and source avatars
- Repurpose list: one bordered list with source avatar, watched format, destination avatars, stats and status
- Repurpose page in the channel settings pattern: header with source avatar, tabs, settings rows and destination switches
- App RepurposeResource sends the source account with its avatar (the public API shape is unchanged)
- Repurpose source picker uses ChannelAvatar
- Idea assistant buttons only open the sidebar
- Post type radios centered in their panel
* chore: drop stray resource stub and the facebook settings rows case
* feat: single media button with upload in the editor toolbars
- The media menu is one button: upload from computer first, then Canva, Google Drive, Google Photos and Unsplash
- Removes the last-used source split button and the separate thread upload button
- Upload opens the right picker in the composer cards, thread posts and the idea editor
* feat: api and mcp parity, insights redesign, mobile polish and composer performance
- API and MCP share the web rules and permissions: posts, approvals, media,
labels, signatures, webhooks, api keys, repurpose, ideas and stages,
queue and scheduling, insights (workspace and per channel)
- MCP authorization mirrors the web abilities for every tool
- Content type derived from media when API/MCP omit it
- Paginated API/MCP lists; PostResource gains author, approval and group
- Channel insights: tags and post type filters, metrics chart with presets,
per-post table paged by 10, column chooser, network-aware metrics
- Meta collectors keep supported metrics when one is rejected
- Composer: once props for workspace data, per-open live data, Pinterest cache
- Schedule tabs load the list after the shell with one skeleton
- Mobile: full-screen dialogs, dialog footer, calendar, channel settings,
composer, filters, sidebar auto-collapse
- Generate ideas returns one idea to use or regenerate
- Inertia 3.5.1 / @inertiajs/vue3 3.8.0
* feat: pr review fixes, deploy safety, api/mcp parity and redirect channel connect
- Deploy safety for 2.0: mixed paused/active posts stay scheduled, legacy queued jobs keep working, legacy aspect ratio crops baked in the release, legacy targets publish like before, giphy source normalized, invite emails lowercased
- Publishing: rate-limit refusals retry after 1h, 2h and 4h; media ratio rules follow each network's docs; Instagram story AI flag sent
- Posts core: row locks on edit/delete, queue slots kept for approval edits, recurrence in the channel time zone, approval members delete only their own posts
- Security: post card and note authors expose only safe fields, upload MIME sniffing on every entry point, safe media serving, Mastodon SSRF guard, granted OAuth scopes checked
- API and MCP: full post capability parity, post notes, TikTok creator info, media upload flow fixes, uuid validation, 404 for foreign records, per-workspace API limiter
- Analytics: Bluesky discovery, retries with backoff, per-account limits, YouTube quota batching, insights by the viewer's time zone
- Channel connect: full-page redirect with a confirmation page, switch account, cancelled and missing permission states, lands on the channel page
- Ideas board scroll pagination per column, composer fixes, i18n and mobile polish, dead code removed
* fix: contrast tokens and calendar post details on phones
- Darker light subtle text, lighter dark input borders, readable link blue in dark previews
- Tapping a post in the calendar on a phone opens its details dialog directly
* fix: pr review follow-ups for connect coverage, translations, api checks and network limits
- Every popup-era connect test scenario mapped or re-added on the redirect flow
- 144 translation fixes across 13 locales; Polish RSS feeds named Kanały RSS; one-line fit tests for the new strings and the create tabs
- API requests and MCP tools authorize the record before validating the body (404 before 422)
- TikTok creator info reads error codes on 200 responses; documented init/status codes mapped
- Bluesky analytics limited per PDS host with reset headers honoured
- Analytics collectors check the granted scope before calling the network
* feat: billing and settings cleanup, sidebar polish and analytics follow-ups
- Billing shows the current plan with a change-plan dialog; the account page and accounts.billing_email are gone, Stripe customers use the owner's email
- Workspace invites name the workspace instead of the account
- Settings sidebar collapses to icons like the app sidebar and shares the user menu and collapse toggle
- Collapsed app sidebar shows whole network badges and a hover card per channel; settings nav shows the channel count
- Channel settings page split into components with a shared Stepper; copy-from-channel search; custom goal stepper inline
- Charts keep their width while the sidebar animates; repurpose header, calendar post details and insights tweaks on mobile
- Connect page clears the provider fragment on every navigation; contrast tokens and sidebar beta badge
* feat: simpler auth pages with password requirements
- Login and register titles are just "Log in to TryPost" and "Create a TryPost account"; the register email form is always open
- Register shows a live checklist of the password requirements, built from the same rule the server enforces
- One password rule in every environment: 12+ characters, mixed case, a number, a symbol and not compromised
- Auth pages use the shared LanguageSelect with browser suggestions; the old LocaleSwitcher is gone
- Legal line sits at the bottom of the form column, the G2 rating moved under the reviews, and content is centred on phones
* feat: mobile calendar in columns, three days view and responsive filters
- Calendar on phones uses the desktop grids (week, month and a new three days view)
- Period picker sheet on phones with view switch, date picker and today
- Shared filter menu: separate controls on desktop, bottom sheet on phones
- Header actions teleport to the header on desktop and stay on the toolbar on phones
- Global mobile bar with menu and logo, notes and tabs open as bottom sheets
- One-word Portuguese weekday names, breakpoint composable on Tailwind breakpoints
- Goal dialog, referral survey, billing processing and channel insights polish
* fix: heic conversion on long-lived imagemagick 6 processes and ci test stability
- Drop the Imagick time limit from HEIC decoding: ImageMagick 6 counts it from the
first pixel access of the process, so long-lived workers rejected every HEIC
- Mount the app after the initial translations load so raw keys never flash
- Shorten ar, fr, ru and el copy that wrapped with Linux font rendering
- Layout tests wait for the Inter web font before measuring
- Insights and sidebar tests wait for the full condition instead of racing
- CI prints logged warnings when backend tests fail
---------
Co-authored-by: Paulo Castellano <paulo@castellanos.llc>1 parent f9fc951 commit c22b2ce
2,849 files changed
Lines changed: 244752 additions & 68937 deletions
File tree
- .agents/skills
- copywriting
- evals
- references
- humanizer
- medialibrary-development
- references
- upgrade-laravel-v13
- .ai/rules
- .cursor/rules
- .github/workflows
- app
- Actions
- AccessToken
- Ai
- Analytics
- ApiKey
- Favicons
- Idea
- Invite
- Label
- Media
- PostComment
- PostNote
- PostTemplate
- Post
- Approval
- Queue
- Repurpose
- RssFeed
- Signature
- SocialAccount
- User
- Webhook
- Workspace
- Ai
- Agents
- Concerns
- Templates
- Concerns
- Broadcasting
- Casts
- Console/Commands
- Analytics
- RssFeed
- Scripts
- Dto
- Analytics
- Enums
- AccessToken
- Ai
- Analytics
- Media
- Notification
- PostHog
- PostPlatform
- PostTemplate
- Post
- RssFeed
- SocialAccount
- UserWorkspace
- User
- Webhook
- Workspace
- YouTube
- Events
- Ai
- Exceptions
- Analytics
- Media
- Post
- RssFeed
- SocialAccount
- Social
- Helpers
- Http
- Controllers
- Api
- App
- Concerns
- Settings
- Auth
- Concerns
- Middleware/App
- Requests
- Api
- Analytics
- ApiKey
- Asset
- Channel
- IdeaStage
- Idea
- Label
- PostNote
- Post
- Repurpose
- Signature
- SocialAccount
- Upload
- Webhook
- App
- Ai
- ApiKey
- Asset
- Auth
- Channel
- Idea
- Insights
- Integration
- Invite
- Concerns
- Label
- Media
- Pinterest
- PostComment
- PostNote
- PostTemplate
- Post
- ReferralSource
- Repurpose
- RssFeed
- Settings
- Signature
- Webhook
- Welcome
- Workspace
- Auth
- Mcp/Asset
- Resources
- Api
- App
- HandleInertiaRequests
- Jobs
- Ai
- Analytics
- Media
- PostHog
- Post
- Repurpose
- RssFeed
- Label
- Mail
- Mcp
- Concerns
- Requests
- Repurpose
- Webhook
- Servers
- Tools
- Analytics
- ApiKey
- Asset
- Idea
- Label
- Platform
- Post
- Repurpose
- Signature
- SocialAccount
- Webhook
- Workspace
- Models
- Scopes
- Traits
- Observers
- Policies
- Providers
- Rules
- Services
- Ai
- Analytics/Collectors
- Followers
- Metrics
- Publications
- Brand
- Http
- Image
- Media
- Sources
- Post
- ExternalMedia
- Repurpose
- RssFeed
- Parsers
- Social
- Concerns
- Discord
- LinkCard
- Meta
- Telegram
- Socialite
- Support
- Analytics
- Auth
- Inertia
- Mail
- Media
- Repurpose
- Requests
- ApiKey
- Idea
- Label
- Post
- Repurpose
- Signature
- Webhook
- Social
- bootstrap
- config
- database
- factories
- migrations
- docker
- docs/superpowers
- plans
- specs
- lang
- ar
- de
- el
- en
- es
- fr
- it
- ja
- ko
- nl
- pl
- pt-BR
- ru
- tr
- uk
- zh
- maizzle
- components
- images
- layouts
- templates
- public
- images
- ai-templates
- emails
- trypost
- resources
- css
- fonts
- js
- components
- accounts
- ai
- analytics
- channel
- workspace
- charts
- api-keys
- assets
- auth
- billing
- channels
- command-palette
- create
- feeds
- ideas
- templates
- labels
- mcp
- media
- members
- posts
- ai
- composer
- create
- editor
- previews
- publish
- repurpose
- settings
- signatures
- ui
- alert-dialog
- badge
- breadcrumb
- button
- calendar
- card
- carousel
- chart
- checkbox
- combobox
- command
- date-range-picker
- dialog
- drawer
- empty
- field
- hover-card
- input
- kbd
- native-select
- popover
- progress
- radio-group
- range-calendar
- select
- sheet
- sidebar
- skeleton
- sonner
- spinner
- stepper
- switch
- table
- tabs
- tags-input
- textarea
- tooltip
- webhooks
- webhook
- welcome
- workspaces
- composables
- echo
- layouts
- app
- auth
- mcp
- lib
- mediaSources
- pages
- accounts
- analytics
- assets
- auth
- billing
- channels
- create
- insights
- integrations
- labels
- mcp
- posts
- ai
- publish
- repurposes
- settings
- account
- profile
- workspace
- signatures
- webhooks
- welcome
- workspaces
- types
- utils
- views
- mail
- prompts
- ideas
- post_content
- post_image
- vendor/mail/html
- routes
- tests
- Browser
- Feature
- Actions
- Invite
- Media
- PostComment
- Post
- Workspace
- Ai
- Templates
- Analytics
- Collectors
- Api
- App
- Post
- Auth
- Billing
- Brand
- Channels
- Commands
- Composer
- Create
- Discord
- Enums/SocialAccount
- Image
- Jobs
- Mail
- Mcp
- Media
- Middleware
- Migrations
- Models
- Observers
- Parity
- Passport
- Permissions
- Pinterest
- Posts
- Repurpose
- Services
- Social
- Settings
- SocialAccount
- Social
- Webhook
- Welcome
- Workspace
- Unit
- Actions
- Billing
- User
- Workspace
- Ai/Agents
- Broadcasting
- Config
- Enums
- Ai
- GoogleBusiness
- Media
- PostPlatform
- User
- Workspace
- YouTube
- Exceptions/Social
- Mail
- Models
- Policies
- Rules
- Services
- Ai
- Brand
- Http
- Image
- Media
- Post
- RssFeed
- Settings
- Socialite
- Social/Meta
- Support
- Analytics
- Traits
- fixtures
- feeds
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
0 commit comments