Aller au contenu
KAMOUniverse

Changelog

Ce qui est nouveau.

Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.

  1. · kamo-internal

    Écrire une description de support programmée en texte riche

    La description de l'article est un bandes de trois rangs. C'est la surface d'écriture /kb/nouvelle surface d'écriture maintenant, moins les images et la médiathèque - ceux qui téléchargent dans les médias de la KB, qui sont les bons domiciles pour une un article et le mauvais pour un champ de contexte. La colonne contient deux formes d'ici: un document lexical sur tout ce qui a été sauvegardé depuis, et la prose nue à chaque rangée plus vieux que cela, puisque rien ne réécrit app/lib/richTextField.ts est le pont. Il détecte un document par analyse plutôt que par une douatte de pointe - la prose comme "les clients bêta" uniquement sont légaux, et renifler l'enverrait par l'intermédiaireEditorState, qui lance, ouvre le éditeur vide et perd le texte de l'auteur à la suivante save. La prose héritée du passé est enveloppé dans un document de sorte qu'il s'ouvre sous forme de texte éditable à la place. Un éditeur vidé se série toujours à un paragraphe vierge, donc ce qui est stocké est décidée par le texte en clair que l'éditeur répond, et non par le JSON - un description lit comme absents partout en aval. Chaque lecteur est nourri les mots plutôt que le document: le sorcier de réservation La carte de cueillette conserve son teaser à deux lignes, et l'échelon de confirmation gagne le rendu description, qui est le seul endroit où le formatage d'un auteur a écrit est en fait lire. RichTextView le rend à travers le lexical d'assainissementToHtml, et montre un Valeur héritée du texte échappé - quelle que soit la pâte qu'une pâte a été transportée dans un texte clair Le domaine est exactement ce qui, autrement, courrait. KbArticleEditor gagne l'espace réservé et autoriseMedia; la typographie de la prévisualisation des notes dans globals.css est maintenant partagé avec une surface de lecture en texte .kamo, qui Ne diffère que par le fait que ses liens fonctionnent. Nécessite le MediaService qui connaît la descriptionPlain - déployé et vérifié avant que cela ne débarque, puisque son ObjectMapper rejette des propriétés inconnues.

  2. · kamo-login

    Ajouter le cueilleur de l'espace de travail

    Une connexion qui nomme aucune organisation ne revient maintenant avec une liste au lieu de une session. C'est la moitié cliente: /api/login passes qui supporte la charge utile (avant le contrôle non-OTK, qui autrement signalerait un très bon signe en cas de défaillance), /api/session/select relaye le choix et les plantes la session exactement comme /api/login fait, et une troisième étape de la carte demande laquelle l'espace de travail. Construit autour de ce que font réellement les membres, qui est ouvert le même espace de travail que la dernière fois: le souvenir est présélectionné et nommé sur le bouton, donc il se lit comme une confirmation plutôt que comme une enquête, tandis que chaque autre solution. reste un coup de frappe. Les touches fléchées se déplacent, entrez les ouvertures et la recherche apparaît au cours des huit derniers espaces de travail. L'alias sous chaque nom n'est pas la décoration. Les organisations ici véritables noms de partage -- il y en a quatre appelés "Acme Corp" -- c'est donc la seule chose qui dit deux rangées à l'écart. Un florissant: un seul rail qui jaillit entre les rangées par l'intermédiaire d'une configuration commune, donc La sélection du clavier est lisible sans anneau de mise au point sur chaque élément. Honoré contre les mouvements préférés, et l'étape ne s'incite qu'après le mot de passe, donc l'opacité sérialisée:0 qui fait des états initiaux de Framer La première peinture de bloc ne s'applique jamais ici. Toujours inaccessible dans la production: SecurityService ramène le cueilleur derrière qui est éteint. Cela débarque l'UI d'abord, le drapeau a quelque chose à allumer.

  3. · MediaService

    Porter la description du type dans les deux formes

    La description est un document Lexical maintenant, donc le service stocke le texte en clair le miroir le client envoie à côté et aiguille des lecteurs, quelle que soit leur forme, utilisation en fait. WebinarTypeDTO gagne en descriptionPlain pour une surface qui veut les mots plutôt que le document. La réservation publique DTO et le DTO-webinar prévu obtiennent texte en clair - ni une page anonyme ni un rappel n'ont un lexical l'exécution, et l'impression de l'état d'éditeur brut chez un lecteur est pire que rien. Le miroir est écrit sans condition à côté du document: une demande portant aucun miroir transporte de la prose, donc l'effacer remet la rangée dans l'héritage les lecteurs de forme retombent déjà vers, où un miroir rassis à côté d'un nouveau description serait des mots qui ne correspondent plus. Exige la colonne webinaire.type.description-plain, appliquée par KamoInitializer et vérifié présent à Yugabyte avant que celui-ci ne débarque.

  4. · InitializerService

    Colonnes de description du texte riche sur le webinaire

    Les miroirs changent d'entité partagée. Deux choses dont le tableau a besoin avant MediaService les cartographie. La colonne de description doit être non liée: elle tient un état de l'éditeur Lexical maintenant, et un plafond varchar ne tronquerait pas, il rejetterait l'ensemble de l'épargne avec une erreur de valeur trop longue à l'intérieur d'une mise à jour transactionnelle qui roule ensuite en arrière et ne laisse rien pour l'expliquer. Vérifier ensuite le tout plutôt qu'un ALTER nu, parce que l'entité a déclaré TEXT depuis la création du tableau, etc. base de données de cette plate-forme exécute les courts-circuits de la sonde et aucune DDL n'est délivrée à l'adresse suivante: qui importe sur YugabyteDB où un ALTER COLUMN ... TYPE enregistrerait un échec à chaque startup. description-plaine est nouvelle: le miroir en clair, nullable sans défaut, parce que null est la valeur honnête pour chaque ligne qui est antérieure à l'éditeur et est ce qui dit à un lecteur de retomber dans la description. Vérifié par rapport au groupe en direct: la description était déjà un texte, et les deux des colonnes sont présentes après la course.

  5. · kamo-shared-library

    Stocker la description du type en texte riche

    La description est une description de l'article L'éditeur lisse dit maintenant plutôt qu'une ligne de prose, donc la colonne doit être un TEXTE non lié en tant que long varchar - une nappe sur une carte à cordes à un PostgreSQL gros objet (oid) sur Hibernate 6, que cette colonne n'est pas. DESCRIPTION-PLAIN est le miroir en clair que l'éditeur écrit à côté de la Document, pour la même raison TrainingSlide garde bodyText à côté du corpsJson: Seul un runtime lexical peut lire un document Lexical, de sorte que chaque consommateur qui veut les mots devraient autrement expédier une anser pour l'internaute d'un éditeur format. RichTextValues indique l'une ou l'autre forme, car les lignes écrites avant le L'éditeur débarqué détient toujours la prose et rien ne les réécrit. PublicWebinarTypeDTO continue à servir de texte en clair: une page de réservation anonyme n'a pas Le temps d'exécution lexical, et un domaine public passant silencieusement de la prose à JSON éditeur brut d'impression de l'État chez un visiteur. CreateWebinarTypeRequest gains ignoreInconnus - MediaService construit le sien ObjectMapper d'un nouvel objet nu(), donc FAIL-ON-UNKNOWN-PROPERTIES est à la défaillance de Jackson du champ vrai et de chaque futur ici est un piège d'ordre de déploiement.

  6. · SecurityService

    Laissez un membre s'inscrire sans qu'un hôte ne nomme son org

    Ajoute la seconde moitié de la scission : signe qui ne nomme aucune organisation authentifie l'utilisateur, puis demande quel espace de travail. POST /api/security/session/select transforme un choix en session, et SignInCompletionService maintient chaque porte entre un mot de passe correct et un session utilisables afin que la connexion et la sélection ne puissent pas dériver. Il a été atteint dans deux cas. Un hôte qui nomme aucune organisation ne s'en reporte toujours. avant maintenant c'était un signe qui ne pouvait pas réussir du tout, donc rien n'est enlevés. L'hôte de la plate-forme est le cas où le changement existe pour: login.kamocrm.com se dérobe à KamoCRM Inc., donc sans cela, ça continue c) Désidentification de chaque inscription à cette org et membre d'une organisation sans domaine Je n'arrive toujours pas à entrer. Ce deuxième cas est à l'arrière FAUX FAUX par défaut. Le faire en sorte qu'un membre de plusieurs orgs reçoive une liste d'espaces de travail au lieu d'une session, qu'un client qui ne peut pas en rendre un Il est dit un identifiant échoué - 17 des 53 utilisateurs ont plus d'un membre. Il se poursuit avec la libération qui enseigne le cueilleur de kmo-login. Jusqu'à puis cette libération ne change rien pour quiconque en signant aujourd'hui, et un un domaine personnalisé garde le chemin d'origine dans les deux sens. Les règles de divulgation sont préservées délibérément. Un mot de passe correct qui peut entrer rien n'est refusé dans les mêmes mots qu'un mauvais, ou la forme devient un oracle pour les justificatifs de justificatifs valides. La liste des espaces de travail n'est jamais un autorité: la sélection réprime l'adhésion, donc une édité, une anomalie ou une invention liste reçoit un refus. Le jeton select n'est pas une session -- à usage unique, cinq minutes, un identificateur d'utilisateur et Rien d'autre. - correctement signalé le nouveau en tant que critère d'évaluation avant la session ; il est évalué à l'inclusion avec le raisonnement, puisque le critère d'extrémité dont le but est de frapper une session n'a pas à résoudre. Org ids croise chaque nouveau fil sous forme de chaînes de chiffres. 1200096283020229788 est un réel id ici et n'a pas de double représentation exacte. 923 essais réussissent.

  7. · InitializerService

    Souvenez-vous du dernier espace de travail qu'un membre a signé pour

    users.last-org-id soutient le cueilleur de l'espace de travail. Une organisation n'est pas plus longtemps nommé par le nom d'hôte, de sorte qu'un membre qui appartient à plusieurs choix l'une après avoir signé; cette colonne s'arrête qu'il s'agit d'une nouvelle décision matin. Une déclaration, contrairement aux quatre de UserIsFakeMigration. Cette colonne finit PAS NULL avec un DEFAULT et Yugabyte rejette ADD COLUMN... NE PAS NULLER table peuplée. Celui-ci est délibérément annulable sans défaut et non clé étrangère: NULL est la valeur significative pour "n'a pas encore été choisi", qui est-ce que tout compte est antérieur au cueilleur, et une clé étrangère laisserait un org supprimer un bloc d'inscription. Un id ois cades est inoffensif -- le cueilleur seulement l'utilise pour présélectionner une ligne qu'il est déjà énumérant. Déjà appliqué à la base de données en direct, car ce service n'a pas d'IC et qui le poussent n'expédie que; c'est ce qui donne un nouvel environnement colonne.

  8. · kamo-internal

    Un fichier peut être abandonné n'importe où sur une fenêtre de discussion, pas seulement sur la bande d'entrée

    La cible de goutte était la surface du compositeur seule - quelques dizaines de pixels en bas d'une fenêtre Par ailleurs, tous les messages sont pris en compte. Une capture d'écran laissée par la conversation n'a rien fait du tout. et pire: la valeur par défaut du navigateur pour un fichier non revendiqué est à NAVIGER l'onglet dans le fichier, qui prend avec elle chaque fenêtre d'outil ouverte et chaque projet non envoyé. "useComposerIngest" gagne "bindDropTarget", qui lie les gestes de traînée à un élément Compositeur ne possède pas, et "ComposerSurface" résout cet élément du DOM - la coque Sa propre « fenêtre d'outil » ou « data-chatbox-root » pour une discussion qui tire sa propre trame. Indigène les auditeurs dans la phase CAPTURE, donc rien à l'intérieur de la fenêtre ne peut prendre le geste en premier ou s'arrêter court avant que la fenêtre ne l'ait vu; seuls les traînées portant des fichiers sont revendiquées, donc le chat d'IA L'arborescence de dossiers maintient ses propres glisser-déposer sans être touché. Un glissement de fichier est revendiqué même en joignant est verrouillé - le refus du dossier ne doit pas coûter au membre la page. Un ingest par compositeur encore, de sorte que la fenêtre et la surface ne peuvent jamais mettre en place la même goutte deux fois. Le chat des membres, les tickets d'assistance, les conversations sociales, le chat AI et les SMS sont tous obtenus à partir de la surface qu'ils partagent; un compositeur sans fenêtre autour d'elle garde le vieux comportement.

  9. · kamo-internal

    Laisse tomber le bloc de salut et mettre la tête de mât sur une ligne

    La tête de mât du pavé de lancement portait un kicker, un "bon après-midi" et un ligne d'état des applications/titr/essai/date à côté du logo, et le membre commandes flottantes sur elle absolument - donc l'en-tête réservé une gouttière de 150px et 130px de hauteur pour dire l'heure de la journée. Le logo et les commandes maintenant partager une ligne de flex, qui est la hauteur du logo seul, et la grille commence cela beaucoup plus haut.

  10. · kamo-internal

    Déplacer les liants et les téléchargements à droite de la bande

    La bande sépare maintenant ce qu'un gestionnaire de documents est d'où il vous emmène. Gauche : Originals, modifiés, communs et trois vues des mêmes documents. D'accord : les quatre raccourcis d'icône, puis les Binders et les Uploads en tant que destinations, leurs étiquettes et leur peinture. Là-bas, ils ne sont plus des enfants de Tabs, donc ils ont mis en actionTab eux-mêmes et marquer leur propre état choisi - il n'y a pas d'indicateur extérieur le groupe pour le faire. Une onglet peinte montre la sélection avec un soulignement blanc: brun et bleu qui est le seul indice qui lit en un coup d'oeil sans déranger le remplissage, et il se réserve le 3px, qu'il soit choisi ou non, l'étiquette ne pas changer lorsqu'on clique sur son clic. peintedTab porte également sa propre typographie et son calibrage maintenant. À l'intérieur des Tabs est venu de la part du parent - .MuiTab-root; un onglet autonome n'en hérit pas et aurait été rendu à la majuscules par défaut de MUI.

  11. · kamo-marketing

    Fixer le titre des guillemets de guillemet

    Citations autour de la ligne de bannière, comme on l'a demandé, mais rendu à partir du CSS (--souvert---------------------------------------------------------- corde, pour deux raisons. Le gazoduc a déjà été traduit par le document intitulé « previewBanner.headline » en 19 localités. depuis qu'e67f59b a atterri. "tralate.ts" ne fournit une clé que lorsqu'elle est manquante ou toujours égal à l'anglais, donc ajouter des citations à la valeur anglaise laisserait tous les 19 Traductions exactement telles qu'elles sont - cités en anglais, non cotés, tout le reste - Et il n'y a plus de retard de force. C'est le piège le renommé en e67f59b a été écrit pour éviter, et le faire à nouveau pour la ponctuation signifierait une troisième nom clé et une deuxième retraduction complète d'une ligne qui n'a pas changé de mot. Et le glyphe n'est pas partagé. Ensembles allemands "...", français « ... », japonais... Un paire tapée en.json est une convention que les 21 autres lieux ont portée à tort ou chute; 'quotes: auto's' résout contre le 'lang' sur 'html', qui (locale)/layout.tsx se crée déjà par local, donc chacun obtient la sienne. Anglais résout au « bouclé ».... ce que l'affichage de la copie veut plutôt que la machine à écrire paire. "quotes: auto est la valeur initiale et est écrit de toute façon - - citations est hérité, donc une règle d'ancêtre ajoutée plus tard pourrait autrement changer ce que cette rend sans toucher ce bloc. Rien d'autre dans globals.css ne le définit aujourd'hui. Aucun changement de dictionnaire dans celui-ci, donc pas de refoulement d'ordres pour se tromper.

  12. · kamo-internal

    Expression et couleur, Esprit Animal et logo en tant que décision unique

    Deux contrôles de coin deviennent un. Cette scission a été un accident de l'ordre Caractéristiques expédiées plutôt qu'une distinction que tout le monde détient: une couleur, un motif et la marque de l'organisation est trois LAYERS d'une question: qu'est-ce que cela? La vitre ressemble à - et ils se combinent. Les choisir parmi deux pop-ups signifient que vous Je n'ai jamais pu voir la combinaison que vous fabriquiez en la faisant, donc la feuille s'ouvre sur un aperçu en direct empilant les trois exactement comme le panneau les empile. ANIMAUX DE THIRTY-FOUR SPIRIT, en tant que SVG 'pattern' defs plutôt que de gradients CSS. Les gradients font des rayures et des points et très peu d'autres choses, et la moitié cette liste est les rosettes, les plaques polygonales, les écailles qui se chevauchent et la plume des yeux d'un paon. SVG dessine des formes réelles, reste croustillant à n'importe quelle taille de vitre, prend l'encre du membre directement, et est une majoration plutôt qu'un actif - aucune demande pour que le DSP ait un avis sur et pas d'octets à transmettre. Les formes sont inversées les données déclaratives en éléments, donc rien n'atteint le DOM comme une corde interpolée, et chaque l'encre est vérifiée sur le chemin dans la même raison que le concepteur de cadre les couleurs sont. La couleur et le modèle sont stockés séparément et se combinent, parce qu'ils sont choix séparés: changer votre esprit sur la couleur ne doit pas perdre le animal. L'encre par défaut du motif est la couleur de bord du papier, c'est-à-dire la couleur plus profonde. Compagnon - donc "Sage - Léopard" signifie léopard dans la sauge plutôt que dans le léopard une teinte non liée, qui est ce qu'un membre choisissait clairement ces deux-là. Une encre explicite de la rampe d'orgue ou de leur propre palette l'emporte. Le motif peint sous le contenu de la vitre et son verre, contrairement à la marque d'orge qui a dû se déplacer devant pour survivre au flou. Une texture appartient à la la même surface givrée sous la couleur; à l'avant, elle imprimerait du zèbre éloigne le texte de quelqu'un. S'applique partout où les anciens contrôles ont fait - widgets, app fiches, notes épinglées, la bande de toile épinglée - puisque tous les quatre ont déjà partagé la vitre chrome. PaneColorButton et PaneBrandControl sont supprimés plutôt que laissés à côté de leur remplacement: deux façons de définir une chose est la façon dont ils dérivent.

  13. · kamo-internal

    Comptez sur l'onglet Liants, et atterrissez sur Selected Docs

    L'onglet indique "Binders (n)" de sorte que le compte de la barrette Selected Docs est visible de la bande - y compris (0), ce qui vaut la peine d'être vu, puisque il dit que le liant est vide avant que le membre ne se rende à la recherche. L'entrée de l'onglet ouvre maintenant Selected Docs. Le membre arrive ici depuis le choix documents, de sorte que le liant est ce pour quoi ils sont venus; les faire trouver dans le la liste était une étape sans décision. L'ouverture d'un autre liant au cours d'une visite n'est pas annulée par la synchronisation suivante: Le drapeau "déjà atterri" est un redémise à zéro par démontant, de sorte qu'il relandedé par visite plutôt que de se battre contre le membre à mi-session. Une nouvelle clé i18n plutôt qu'un re-titré de tabs.binders: le dialogue du paquet juridique utilise celui-ci comme une étiquette ordinaire et n'a pas de compte à mettre dedans.

  14. · kamo-internal

    Le cadre de l'image est la vitre, pas quelque chose à l'intérieur d'un

    Tous les autres widgets se contentent de la carte en verre dépolie du pavé, avec un une tête, un titre et un contrôle de coin. Un cadre d'image n'est pas: rendu que de sorte que c'est un cadre assis à l'intérieur d'un second cadre invisible, et le moulage le membre conçu devient un détail à l'intérieur du rectangle de quelqu'un d'autre. Donc le registre gagne «ownsSurface», et le déclarer enlever exactement le Trois choses qui se battent contre un tel widget plutôt que de le servir - le verre surface, le paysage de fond de COLOUR (un cadre a déjà une couleur de matelas et un moulant le membre choisi) et le fond LOGO (un filigrane imprimé sur la photo de quelqu'un). Les deux endroits qui peignent la décoration de la vitre d'honneur c'est: la grille triable et la bande de widget à épinglé. Ce que l'en-tête transportait est toujours là comme des contrôles qui s'estompent au-dessus de la le moulage - le nom du cadre sur une plaque lisible en bas à gauche, le cheminement dans son l'éditeur et le contrôle de suppression en haut à droite. Sombre et translucide plutôt que Le chromage de la lumière habituel du lacmoteur, parce que ceux-ci reposent sur une photo et une pâleur un bouton qui disparaît au moment où un ciel clair atterrit dans ce coin. Ils s'arrêtent pointer des événements d'atteindre la vitre en dessous, ou d'atteindre l'éditeur commencerait une traînée. Un drapeau sur le registre plutôt qu'une vérification de l'id de ce widget, donc le Un deuxième widget qui peint sa propre surface n'a besoin de pas de changements ici.

  15. · kamo-internal

    Montrer sur quelles couches d'un document modifié ont été travaillées

    Un document a un enregistrement modifié, de sorte que l'onglet modifié a une ligne par document. La colonne nomme les couches touchées plutôt que celle de deux types a Le document était: Document une fois que ses octets différaient des champs de forme de l'original, des champs ont été posés, et "Non encore édité" pour un enregistrement qui était dérivé en ouvrant un éditeur et puis rien n'a été fait. Ce dernier état est réel et vaut la peine de dire : l'ouverture d'un éditeur dérive l'enregistrement, donc demander une couche là-bas dirait au membre qu'ils ont édité quelque chose qu'ils n'ont regardé.

  16. · kamo-marketing

    Échangez l'insigne NOW LIVE pour le titre qu'il cachait

    La bannière supérieure menée avec une pilule à six caractères - bordée, en majuscules, pulsées - et mettre le message proprement dit après. La pilule porte maintenant le message lui-même : "Runir votre entreprise sans Kamo est une erreur." Aucun des badges chrome ne survit à cela. Une boîte de 1px autour d'une phrase complète est la lecture en tant que bouton, "transforme textuelle: majuscule" crier une ligne écrite en phrase cas, et le suivi 1.2px est une mesure de badge plutôt qu'une mesure de lecture. Le Le lavage blanc et son image clé "badge-pulse" vont avec eux, avec l'entrée morte ".preview-banner-live" dans la liste des mouvements réduits - le l'animation était sur le pseudo-élément, donc épingler l'élément n'a jamais rien fait. Ce qu'il reste est audacieux et blanc. gradient derrière elle, mesure 5,25:1; le reste de la bannière se trouve à 0,92 alpha, donc le poids et ce dernier 8% de blanc séparent le titre de la ligne de changelog à côté. Le point d'arrêt se déplace 640px - 768px. Ce nombre a été choisi quand ce créneau horaire tenait six caractères; la ligne d'aujourd'hui patinage mesure maintenant 625px avec le changelog copy après elle, donc à 640px la bannière dépenserait la dernière '15px de sa gamme monoligne débordant sa propre boîte fixe de 38px. 768 fait également droit à la s'entendant avec le point d'arrêt de la marche réduite ci-dessous, de sorte que la bannière cesse de chatouiller et commence à emballer à une largeur au lieu de deux 128px. La clé de copie est RENAMED, non réévaluée (côté dictionnaire, même jeu de changement). une clé uniquement en cas d'absence ou de sa valeur est égal à la source anglaise - il n'a aucune notion de chaîne anglaise qui a changé. L'édition de 'nowLive' en place aurait laissé les 21 sites locaux traduits "Maintenant En direct, jusqu'à ce que quelqu'un pense qu'il coure. Une nouvelle clé manque partout. La synchronisation suivante le capte, et 'writeLocaleFile' iterates les clés d'en, qui taille l'ancien de chaque localité. Jusqu'à ce que cela court, le repli anglais fusionner dans i18n/request.ts rend la phrase anglaise plutôt qu'une clé brute.

  17. · InitializerService

    Fusionner les deux enregistrements modifiés en un avec deux couches

    Lorsqu'un document a les deux types, la rangée CLASSIQUE survit - c'est celle qui peut contenir des octets élastiques - le dessin est re-dépeint sur lui, et le FORM-FILLABLE la ligne est supprimée. Perdre l'une ou l'autre partie serait perdre le travail des membres: les octets sont les modifications effectuées dans LibreOffice, la conception est le placement sur le terrain effectué à la main. L'indice unique devient une ligne par original plutôt qu'une par (original, nature), et n'est construit qu'après que la fusion ne laisse aucun document tenant deux. l'audace est délibérément laissée dans le tableau. Retirez-le casser n'importe lequel DocsService pod continue à exécuter l'image précédente à mi-exécution, qui nomme le colonne dans chaque Img SELECT; il peut aller une fois que la flotte a tourné. Le coureur précédent ne crée plus l'ancien indice unique par nature, donc les deux Les migrations ne dépensent pas toutes les courses pour y faire face. Appliqué à prod avant cette poussée: 8 lignes modifiées, 4 modèles de port, 2 avec Les octets divergeaient, aucun n'a doublé, rien n'a été perdu.

  18. · kamo-internal

    Cadre d'images - photos et vidéos d'un membre, dans un cadre qu'ils construisent

    Le premier widget INSTANCED. Un membre pend autant de montures qu'ils le souhaitent, chacun avec son propre contenu, son propre moulage et sa propre place dans le réseau, tous à partir d'une entrée de registre. LE MITRE. Un cadre est UN seul profil de moulage répété sur quatre côtés et coupé à où ils se rencontrent, ce qui est la façon dont un véritable cadre est fait et la raison pour laquelle Le modèle n'a pas de "frontière supérieure" ou de "frontière gauche" - il n'y a rien à suivre Parce qu'il n'y a qu'une chose. Un membre conçoit la section transversale, les quatre les côtés en tombent, et chaque coin est une ligne de 45 degrés par la CONSTRUCTION plutôt que par un style que n'importe qui peut se tromper. Chaque face est un trapèze taillé à partir de une boîte grandeur nature et peinte avec une pente allant du bord extérieur vers l'intérieur; les extrémités inclinées sont la mitre, et quatre d'entre elles tuilent la frontière avec pas de chevauchement et pas de limite. les couleurs de la frontière auraient été gratuites et étaient les couleurs un mauvais outil: ils ne peuvent pas porter un profil multi-bandes ou une texture, et un membre qui a édité une partie aurait trois autres à réparer. LA PITURE. Le rapport d'aspect est toujours conservé, le cadre toujours rempli, le débordement recadré. Le biboîte à l'intérieur d'un moulage ressemble à une faille dans le cadre plutôt qu'à un moulage propriété de la photo. Les instances se déplacent comme "widget: picture-frame" à travers la disposition, vitrage et la préférence du spectacle/caillage, donc un cadre garde sa propre taille, la couleur, le logo et la position et la dissimulation en laisse seul ses frères et sœurs. L'id vocabulaire déplacé dans widgetIds - pur et couvert, parce que ces cordes sont persistés dans l'arrangement rangé de chaque membre et leur forme est porteurs. Une instance par défaut à SHOWN: le membre l'a fait, et faire c'est la décision de l'avoir. L'éditeur de met le cadre à la taille suspendue sur la gauche et tout ce qui le change sur Le droit. L'aperçu est le deuxième composant que le pavé de lancement rend, pas un fac-similé - un moulage qui semble raffiné à 90px est une dalle à 400, et deux les moteurs de rendu dériveraient, l'avant-première étant celle qui a dérivé. Les Saufs-Saufs sont débrouillé et optimiste: la conception d'un cadre est une centaine de petits changements dans un minute, donc un bouton d'enregistrement signifierait perdre le lot à un faux clic. Chaque couleur dans un dessin stocké est vérifiée avant d'atteindre un modèle. gradient. Ces blobs sont des données d'origine membre qui sont interpolées en un attribut de style, et le contrôle est ce qui empêche une trame sauvegardée d'être un moyen d'écrire des CSS arbitraires. Réordeurs des médias avec des flèches plutôt qu'en traînant: cette grille se trouve à l'intérieur d'un page accessible à partir d'un pavé de lancement, le membre traîne déjà les vitres sur, et Une deuxième surface de traînée de conséquences différentes est la façon dont les gens bougent la mauvaise chose. Les flèches travaillent également sur un téléphone et avec un clavier. Les téléchargements font un à la fois et tir de vingt demandes multipart concurrentes à un pod est la façon dont un membre avec un dépliant de vacances prend le service à tout le monde d'autre part.

  19. · SecurityService

    Critères d'évaluation des cadres et des milieux, et ensemencer les nouveaux droits

    Soi seul, et appliqué dans la QUERY. Chaque lecture et écriture résout le membre de la session et chaque appel du référentiel prend ce id, y compris la recherche d'un cadre unique - un identifiant de trame est un UUID qui se déplace vers le navigateur Et en arrière, donc un trouvéParyId donnerait le mur de quelqu'un d'autre à celui qui a deviné un. Il n'y a délibérément pas de "gestion du sens des cadres d'un autre membre": a Le contrôle de l'administrateur sur cette fonctionnalité est le bon, pas le contenu. Les médias passent par ImageService plutôt que d'être stockés ici, qui achète la dadup à l'adresse de contenu (la même photo dans trois trames est un fichier stocké), la comptabilité de l'administration de l'ogage, et la lecture par l'intermédiaire de l'indicateur d'imagerie existant qui parle déjà HTTP Range, donc une vidéo cherche déjà. Les poirs sont calculé dans le contrôleur parce que le pipeline valide la personne de l'appelant contre le sien et l'appelant ici EST le serveur; c'est ce que tous les autres C'est le cas du téléchargeur côté serveur dans la plate-forme. Un diaporama est ORDER dans les paramètres du cadre blob, pas comme une colonne sur chaque image: une ligne d'imagerie est partagée par chaque association faisant référence à son octets, donc une colonne de tri sur elle appartiendrait à n'importe quel cadre écrit en dernier. La délétion d'un cadre tracer ses médias. Laisser les rangées derrière vous permettrait de garder Facturation de l'organisation pour un mur personne ne peut ouvrir, qui est l'orphelin classer cette plate-forme a été mordue par avant. Plafonds: 12 encadre un membre, 120 éléments une trame, 100 Mo a fichier. La dernière est bien sous les autres limites de téléchargement de la plate-forme à l'inspiration - c'est le mur décoration qui auto-joue derrière un sac de lancement, et une vidéo de 2 Go serait Freché par chaque onglet que le membre ouvre. Les semences de droits de la part de MANAGE-OWN-BACKGROUND-IMAGES, qui le disent déjà Un membre peut décorer son propre écran avec ses propres téléchargements - la graine la plus sûre du lot, puisque rien dans un cadre n'est des données de personne d'autre. ADDED délibérément ne semence PAS, contrairement à tous les autres widgets: les autres s'ouvrent quelque chose que le membre a déjà et est utile le moment où ils apparaissent, alors que Un cadre vide que personne n'a demandé est du fouillis. Les Handlers nomment leur assistante de sessionMembre donc l'absence d'authenticité le cliquet d'extrémité peut voir le garde - son scanner lit une méthode et fait ne pas suivre les appels.

  20. · InitializerService

    Créer le tableau image-image

    Une rangée par widget Picture Frame qu'un membre agencé sur son pas de tir. Un tableau plutôt qu'une blob de préférence parce que les photos et les vidéos dans un trame sont des lignes d'imagerie portant son id dans assoc-object-id, et une association a besoin de quelque chose de durable pour pointer. Un identificateur de cadre ne vivant qu'à l'intérieur d'un membre Les préférences JSON seraient une clé étrangère à rien : rien ne peut imposer que le cadre existe toujours, et l'échange des préférences d'un membre Tout ce qu'ils avaient mis en place a télécharger tout octet orphelin. TEXT tenant JSON exprès. C'est l'apparence du cadre et la lecture entiers pour dessiner une vitre, écrit entier sur save, jamais interrogé dans - de sorte que colonnes chaque nouveau biseau ou grain que le concepteur cultive serait un autre DDL changer l'atterrissage ici avant le service qui le mappe, pour une valeur pas de requête sera jamais filtré. «Ordonneur(0) selon la convention de schéma: une fois que l'entité partage-lib existe, un lanceur qui charge un PictureFrame à travers la JPA émet ces colonnes dans son SELECT, donc une migration ordonnée tardive ne serait jamais atteinte - un plus tôt coureur mourrait sur "les cadres d'images de relation n'existent pas" et prendraient la course vers le bas en premier. NOTE POUR DÉPLOIE: SecurityService fonctionne hibernate ddl-auto: aucun, donc ce tableau n'apparaît pas de soi. Ce service doit être RUN avant le cadre de l'image œuvres de caractéristiques.

  21. · kamo-shared-library

    Le schéma, les droits et le domaine de stockage derrière les widgets de trame

    A Picture Frame est une photo et vidéo de membre sur leur propre lampad. et un membre peut en accrocher plusieurs. C'est tout ce que la plate-forme doit tenir l'un. PictureFrame est une ligne plutôt qu'une clé dans le blob de préférence du membre parce que les milieux sont des lignes d'imagerie associées à une id de trame BY, et une association a besoin de quelque chose de durable à souligner. Portail de la musique par les membres plutôt que piloté par l'utilisateur: les octets sont stockés sous une organisation et comptés contre elle, donc une trame qui suivrait une personne entre des orgs mettrait le stockage d'un org sur une autre le projet de loi d'org. Son aspect est une colonne JSON - lire entier pour dessiner une vitre, écrit entiers à l'exception, jamais interrogé dans - donc un designer qui cultive un biseau Le mois prochain n'a pas besoin d'un changement de DDL avant. ImageAssocType.PICTURE-FRAME donne son champ d'action au CADRE, et non le membre: plusieurs les images sont plusieurs diaporamas, et le cadrage pour le membre ferait de chacun d'entre eux montrent tout. Il achète la ddup à l'adresse de contenu gratuitement, donc un Un membre qui met la même photo en trois images est facturé pour un. StorageDomain.PICTURE-FRAMES obtient sa propre ligne plutôt que d'être replié dans un seau général. C'est le seul domaine d'un peuple d'une organisation qui remplit un quelques mégaoctets à la fois avec personne ne l'administrant, et un org regardant son Il faut que le projet de loi soit tenu séparément des documents sur lesquels ses activités sont en cours. Le test de couverture aurait échoué à la construction autrement, ce qui est le point C'est de lui. Les droits suivent la forme tous les autres widgets utilisés les quatre politiques, les enfants, qui sont suspendus à la propriété de la propriété de la marque qui régissent déjà les médias personnels qu'un membre met sur leur propre écran. Pas une racine: un widget dont la subvention est inaccessible du groupe qui possède son les données sont un droit que personne ne trouve. Ids 229-233; 228 ont été pris. Taxonomie 219/156/32/31 - 224/161/32/31.

  22. · kamo-internal

    Placer les quatre raccourcis entre membres sur une ligne

    sont une classe de contrôle, donc ils partagent maintenant une ligne: le pavé de lancement Le coin supérieur droit se lit comme une seule bande plutôt qu'une pile à deux lignes. coiffant; il utilise la pilule partagéeLinkSx comme ses voisins, et s'effondre Son étiquette à xs comme ils le font, donc quatre raccourcis sont toujours adaptés à un téléphone. La querelle s'enroule plutôt que de déborder lorsqu'un membre en détient chacun d'eux.

  23. · kamo-internal

    Position et couleur pour le logo d'une vitre, et toujours laisser un membre ouvrir l'éditeur

    L'ÉDITEUR était stable pour n'importe quel groupe n'avait pas été décrié. A répondu à la marqueOf nul jusqu'à ce qu'une marque ait existé et que le contrôle soit fermé sur la réponse, de sorte qu'un membre dont les semences n'avaient pas étéstres - ou n'avaient pas persisté - n'avaient aucun butin et n'avait aucun moyen de donner un Monter un logo. Une vitre indécise n'est pas une vitre sans marque, pas une qui l'a manquée : toujours répond, et l'éditeur est toujours là. La bande de widgets épinglé avait le même symptôme pour une raison différente. Il rend l'extérieur SortableCard, qui est ce qui révèle un chrome sur le vol d'aiguillage, donc ses commandes étaient assis à opacité 0 en permanence. Il porte la règle elle-même maintenant. POSITION. Neuf ancres dans le pop-up, dessinées comme une grille dont les cellules tiennent chacune un point dans leur son coin, donc le sélecteur lit comme la vitre qu'il représente. La rotation a dû passer à le logo lui-même: rotation de la boîte de rangement basculée une marque ancrée autour de la vitre Centre et hors du coin que le membre venait de le mettre. COULEUR. La marque peut être peinte en silhouette solide, à travers le thème ThemeLogo existant. overlayColor - un masque CSS, de sorte qu'il atteint une couleur arbitraire plutôt que de pousser le masque CSS les couleurs de l'œuvre d'art. Deux sources: la rampe de marque de l'organisation Déduite parce qu'une ordonnance qui ne fixe qu'un primaire a sa lumière et la lumière la plus par défaut à la même valeur; et la propre palette du membre, en utilisant le compagnon profond de chaque couleur plutôt que son papier pastel, depuis une silhouette pâle sur une pane pâle est une marque que personne ne peut voir. TAILLE JORE LA ROLL, entre 0,55 et 1,1 de la vitre. Chaque marque à exactement 0,85 était le dire qu'une page a été créée plutôt que composée.

  24. · kamo-internal

    Peindre les notes maîtresses dans les couleurs de l'organisation

    "Notre note principale" est le PRIMARY de l'organisation et "Mon Master Note" DÉCIDURE, chacun sous forme de pastel, une teinte de 18 % sur le blanc. La paire se lit comme un ensemble à un le regard, et ni l'un ni l'autre ne peut être pris pour l'une des douze couleurs post-it a les choix des membres pour leurs propres notes. Dérivé de -color-primaire / --coloré-secondaire plutôt qu'un hexagone, donc une ug de marque blanche a sa propre marque. Le bord est paré contre de l'ardoise et le papier ne l'est pas délibérément: un org peut fixer une primaire proche-blanc, et une teinte de 18 % de ce qui est juste une feuille plus pâle, mais un L'altitude mélangée seule serait une règle invisible, une épingle et un soin. Même chose le raisonnement comme le jeton de la barre de défilement de page. Une conséquence, et c'est le point: une note maîtresse n'a plus de palette. La couleur est ce qui dit dont il s'agit, qui n'est pas le choix d'un membre, donc le swatch est parti de la vitre, de la carte, de l'encollant et de l'éditeur, et de KBService arrête d'ensemencer un. Couleur.edge 33 a dû aller avec. Appliquer des chiffres hexagonaux à un mélange de couleurs() l'expression donne une déclaration que le navigateur chute silencieusement, en laissant les frontières avec pas de couleur du tout; avecStickyAlpha() prend les deux formes et chaque surface des notes va C'est par là qu'il est maintenant. useMasterNotes s'associe également à la cache flottante de l'incfort, la voie à suivre selectPinnedPanes fait - sinon une note maître édité dans son bâton a montré son Texte de montage sur le pavé de lancement jusqu'à ce qu'il soit rechargé.

  25. · kamo-internal

    Mettre les deux notes maîtresses sur chaque rampe de lancement

    "My Master Note" et "Notin maître" sont des vitres dans la même grille triable que Tout le reste - traîné, redimensionné et ordonné comme n'importe quel autre vitrage - et ni l'un ni l'autre peuvent être enlevés. L'organisation porte une bague de crêlage à gradient de crêlé peint de -color-primaire, le seul bord mobile sur la page, donc la seule vitre qui a fait ne provient pas du membre qui se lit comme tel de l'autre côté de la salle. Relèvement à une statique sonner sous-motion préférée-réduction. Les deux sont épinglés, donc ils arrivent dans la liste des épinglés aussi; selectPinnedPanes drops ils sont là, ou chacun serait peint deux fois et le duplicata serait la copie sans l'insigne et le bord. Freché à partir de /api/notes/master, qui n'est PAS gêné sur l'application Notes: le pavé les vitres de note sont l'application Notes se déversant sur la page d'accueil, et il s'agit de meubles de la page d'accueil elle-même. Chaque contrôle que le serveur refuserait est retiré plutôt que désactivé: non décrocher, non supprimer et pas de renom sur l'une ou l'autre note maîtresse, et pas de couleur, pas de barre d'outils et pas de surface de frappe sur l'organisation pour un membre sans droit. A Un membre en lecture seule obtient un lecteur - le même rendu que le volet utilise - au lieu d'un éditeur dont les sauvegardes seraient rejetées après qu'ils eurent fait le travail. notesApi.saveNote routes par l'étendue, donc le collant, l'éditeur, le mur et le l'arrêt du cueilleur de couleur du pavé de lance du lanceur doit savoir que la note de l'organisation a Aucun membre et ne peut donc pas être atteint par le critère d'identification per-id.

  26. · KBService

    Servir, prévoir et protéger les deux notes maîtresses

    GET /api/notes/master répond à la fois et dispositions manquantes. PUT /api/notes/master/org écrit "Notre note-cadre", adressée par organisation plutôt que par note id, il n'y a donc rien à deviner et aucune autre organisation note d'atteindre. L'édition en charge de la MANAGE-ORG-MASTER-NOTE ou de la propriété l'organisation - l'étage propriétaire est la garantie anti-lockout, puisque le droit est délibérément non s'est ensemencé dans les rôles existants. GET/maître prend délibérément PAS de notes à droite. VEW-NOTES Les notes «app»; ce sont des fixations du pavé de lancement, et "chaque membre en a toujours un" a pour désigner chaque membre. Les inscriptions ordinaires conservent leur porte de VUE-NOTES et maintenant Retourne également la note de l'organisation, de sorte qu'elle est lisible et consultable sur le mur. Les règles sont appliquées ici plutôt que dans le client: une note-cadre ne peut être supprimé (409 - un fait sur la note, pas sur qui est demandé), ne peut pas être non coincés, et ne peuvent pas être renommés. Le titre et l'épingle sont ignorés plutôt que rejetés, parce que l'éditeur envoie tous les domaines sur chaque sauvegarde et refuser la demande serait échouer un éditer au CORPS sur un titre que le membre n'a jamais touché. Les clés de contenu suivent: keyForOrg(orgId) pour la note de l'organisation, de sorte que chaque membre de l'organisation peut le lire. Démineuser de celui qui l'a écrit serait rendre une note partagée lisible par une personne. L'approvisionnement est sa propre haricot et sa propre transaction, et chaque fois lu avant sa première écriture: depuis le passage à Yugabyte un SELECT après une écriture en un la transaction peut revenir 40001 et l'ardonner. Méthode privée sur NotesService aurait été inerte en tant que transactionnelle et exécutée dans la transaction de l'appelant.

  27. · InitializerService

    Ajouter les colonnes de la portée-maître aux notes

    MASTER-SCOPE («MEMBER» / 'ORG' / NULL) et ORGANISATION-ID, plus les deux indices l'entité déclare et un indice unique partiel par champ d'application, de sorte qu'une note principale en direct par membre et par organisation est assurée par la base de données plutôt que par la création de find-then-create dans NotesService. Pas de remblai: chaque note existante est une note ordinaire et NULL lit exactement que. Les notes maîtresses elles-mêmes sont fournies paresseusement sur la première lecture : les veulent, qui couvrent les adhésions et les organisations créées après ces actions sans une deuxième migration. Ordonner(0), comme chaque coureur de colonnes: dès lors, la bibliothèque partagée mappe ces colonnes, tout glissière qui charge un Note à travers la JPA les émet dans son SELECT, Ainsi, une migration ordonnée tardivement n'est jamais atteinte. Appliqué à Yugabyte 2026-08-22: les sept déclarations appliquées, les deux colonnes et les quatre indices vérifiés présents.

  28. · kamo-shared-library

    Modéliser les notes de maître et la droite qui garde l'orge

    Une note de maître est la note qu'un membre - ou une organisation - a toujours. "Mon note-maître" est provisionnée par membre; "Notre note-maître" est un par an. et apparaît sur le tremplin de chaque membre. Les deux sont des lignes de notes ordinaires portant un MASTER-SCOPE, pas un nouveau tableau, donc le Éditeur lexical, écoute automatique, versions, couleurs, collers flottants et RAG publier tout le monde en continuant à travailler avec rien à suivre. Une ligne ORG porte un MEMBRE DE NULL ALL MEMBER-ID à l'origine: chaque outil de recherche de la portée des membres matches 'n.member.id' :memberId', donc la note de l'organisation ne peut jamais être Revenu par la liste privée d'un membre, mettre à jour ou supprimer. Lectures qui devraient voir qu'il passe par les nouveaux finders "...VisibleToMember", qui s'élargissent à lui explicitement; écrits gardent la paire à portée de membres et ne peut donc pas l'atteindre du tout. MANAGE-ORG-MASTER-NOTE (228) est une racine autonome avec un service nulType, À la suite de la MANAGE-ORG-BRANDING: les éditeurs de rôle, de titres d'emploi et de département uniquement rendre la section d'un service lorsque l'orge a cette application activée, et le maître d'ordre note est sur chaque rampe de lancement, que Notes soit activée ou non. Non parenté à VISUEILLE pour la même raison - KBService sert la note sans droit de compter.

  29. · kamo-internal

    Marquez un tiers des vitres d'un membre avec le logo de l'orge, et laissez-les ajuster

    Un tiers des vitres d'un membre portent la même marque d'orgueillousse/feuille et le même porte-calendrier, à Échelle de vitre. Les vitres, et comment, sont roulées une fois et maintenues. QU'EST-CE QUE LA ROLL DE DÉCITE. La marque d'une vitre de marque dépend de la forme de la vitre. En entrant, parce qu'un mot-symbole et une icône s'adaptent à différents rectangles. Une vitre carrée est le Dispose de pièces de monnaie entre les deux. Un large un s'appuie sur le mot-symbole à trois sur quatre - a Un mot-mark IS large, et une icône carrée dans une bande de quatre colonnes est un point dans un champ. Un grand prend toujours le mot-caze et tourne-le 90 degrés dans le sens des aiguilles d'une montre, ce qui s'adapte à une grande vitre Mieux que l'une ou l'autre marque étant à plat. Et chaque vitre de marque obtient quelques degrés d'inclinaison Tout ce qui a été enroulé d'autre: une marque posée parfaitement carrée sur une vitre rectangulaire se lit comme une la mise en page, et quelques degrés c'est vrai comme un timbre, qui est ce qu'il est. Le l'inclinaison va dans les deux sens, parce qu'une page de marques toutes penches gauches se lit comme un bogue de rendu. PER PANE, NON EN TOUVER - la différence par rapport à la couleur d'ensemencement, et la raison d'être d'une vitre qui n'est PAS marqué a ce fait plutôt que laissé en blanc. L'absence signifie "cette vitre est nouveau, roulez-le", ce qui permet à un widget allumé le mois prochain, une note épinglée suivante semaine ou une application nouvellement accordée prenez la même carte de passe sur sa première apparition alors que rien déjà sur la page se déplace. C'est aussi le remblai: un rampe de lancement organisée avant l'un des cette existence n'a pas de décisions, de sorte que chacun de ses vitrages est nouveau par cette définition et est enroulé sur la charge suivante. Pas de migration, et aucun membre la fonctionnalité ne parvient à atteindre. L'ORG'S OPT-OUT arrive le premier. Une organisation dont la marque de base n'a jamais été mise en place logos de fond éteints; une nouvelle surface n'est pas une exonération d'une préférence qu'ils ont déjà exprimé, de sorte que ces vitres ne marquent rien de ce qui a été laminé. L'ÉDITEUR. Un contrôle à côté de la couleur un ouvre un popover pour la marque elle-même: plein, simple ou nul, plus rotation, taille, teinte et contraste. Tout y est vivant - le la valeur passe directement dans la préférence que le vitrage rend de, de sorte qu'un membre traînant le Le curseur de teinte regarde la vitre derrière le changement de popover pendant qu'ils traînent. Stocké contre leur membre enregistre comme toute autre préférence de vitre. Le filtre est rotatif de teinte et contraste plutôt que l'échelle de gris du filigrane de la page, parce que l'échelle de gris enlève la teinte et serait ont laissé à l'organe un curseur qui ne bougeait rien. Reset-to-defaults sur la page des widgets NE NE s'effondre pas les marques: re-rolling a Un logo donnerait à quelqu'un un coussin différent chaque fois qu'il le presse, ce qui n'est pas le cas une réinitialisation.

  30. · kamo-internal

    Éditer en mode classique, et redessiner quand il économise

    L'éditeur remplis de formulaire peut maintenant se brancher sur LibreOffice. Le serveur déduit la version classique en cours de route si le document n'en a pas une, qui est la point de l'offrir à partir d'ici - un membre qui n'a jamais ajouté la forme les champs n'ont pas encore de copie classique à ouvrir. Lorsque cet autre onglet sauvegarde, l'éditeur recharge. Les pages sur lesquelles se trouvent ses champs ont juste changé en dessous, et il continuerait à dessiner ceux-là Ils ont été placés. Il le dit plutôt que de redessiner silencieusement: le différence entre "le document mis à jour" et "mes champs sautés pour non la raison", et après un reflux, ils peuvent avoir vraiment besoin d'être en mouvement. L'éditeur qui a conçu l'épargne n'est délibérément pas rechargée - il tient déjà les octets qu'il écrivait, et le recharger rejetterait tout ce qui dactylographié depuis. Les Ids sont comparés comme les chaînes bout à bout. Deux identifiants membres int64 différents EQUAL en nombre, ce qui signifierait une sauvegarde de retard de charge de votre éditeur; le test affirme que l'égalité directe, la raison n'est donc pas seulement un commentaire.

Votre univers vous attend.

Commencez gratuitement en quelques minutes. Ajoutez des produits quand vous êtes prêt. Pas de migration, pas de nouvelles connexions.

Gratuit pour toujours — aucune carte de crédit requise