Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • clients/cesium-grp/cesium-plus-pod
  • clients/java/duniter4j
  • ji_emme/duniter4j
  • dvermd/cesium-plus-pod
  • okayotanoka/cesium-plus-pod
  • pokapow/cesium-plus-pod
  • pini-gh/cesium-plus-pod
7 results
Show changes
Showing
with 2719 additions and 31 deletions
package org.duniter.elasticsearch.client.model.query;
/*-
* #%L
* Cesium+ pod :: Client API
* %%
* Copyright (C) 2014 - 2023 Duniter Team
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Builder;
import lombok.Data;
import java.util.Map;
@Data
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SearchQuery {
private GeoBoundingBoxQuery geoBoundingBox;
private QueryString queryString;
private ExistsQuery exists;
private BoolQuery bool;
private ConstantScoreQuery constantScore;
private Map<String, String> match;
private Map<String, String> matchPhrase;
private Map<String, String> matchPhrasePrefix;
private Map<String, String> prefix;
private Map<String, String> term;
private Map<String, String[]> terms;
private Map<String, RangePartQuery> range;
@JsonGetter("constant_score")
public ConstantScoreQuery getConstantScore() {
return constantScore;
}
@JsonGetter("query_string")
public QueryString getQueryString() {
return queryString;
}
@JsonGetter("geo_bounding_box")
public GeoBoundingBoxQuery getGeoBoundingBox() {
return geoBoundingBox;
}
@JsonGetter("match_phrase")
public Map<String, String> getMatchPhrase() {
return matchPhrase;
}
@JsonGetter("match_phrase_prefix")
public Map<String, String> getMatchPhrasePrefix() {
return matchPhrasePrefix;
}
}
package org.duniter.elasticsearch.client.model.query;
/*-
* #%L
* Cesium+ pod :: Client API
* %%
* Copyright (C) 2014 - 2023 Duniter Team
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.google.common.collect.ImmutableMap;
import lombok.Builder;
import lombok.Data;
import org.duniter.core.util.StringUtils;
import org.duniter.elasticsearch.model.SortDirection;
import java.util.Map;
@Data
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SearchRequest {
public static class SearchRequestBuilder{
public SearchRequestBuilder queryString(String queryString) {
this.query(SearchQuery.builder()
.queryString(QueryString.builder()
.query(queryString)
.build())
.build());
return SearchRequestBuilder.this;
}
public SearchRequestBuilder sortBy(String field, SortDirection direction) {
if (StringUtils.isNotBlank(field)) {
this.sort(ImmutableMap.of(field, direction == null || direction == SortDirection.ASC ? "asc" : "desc"));
}
return SearchRequestBuilder.this;
}
}
private SearchQuery query;
Integer from;
Integer size;
String[] source;
Map<String, String> sort;
@JsonGetter("_source")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public String[] getSource() {
return source;
}
}
package org.duniter.elasticsearch.client.service;
/*-
* #%L
* Cesium+ pod :: Client API
* %%
* Copyright (C) 2014 - 2023 Duniter Team
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.client.entity.EntityBuilder;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.duniter.core.client.config.Configuration;
import org.duniter.core.client.model.bma.jackson.JacksonUtils;
import org.duniter.core.client.model.local.Peer;
import org.duniter.core.client.model.local.Wallet;
import org.duniter.core.client.service.bma.BaseRemoteServiceImpl;
import org.duniter.core.exception.TechnicalException;
import org.duniter.core.service.CryptoService;
import org.duniter.core.util.json.JsonAttributeParser;
import org.duniter.elasticsearch.model.Record;
import org.duniter.elasticsearch.model.Records;
import org.duniter.elasticsearch.model.user.UserEvent;
import org.duniter.elasticsearch.model.user.UserProfile;
import java.io.IOException;
@Slf4j
public abstract class AbstractServiceImpl extends BaseRemoteServiceImpl {
protected static JsonAttributeParser<String> PARSER_HASH = new JsonAttributeParser<>(Record.Fields.HASH, String.class);
protected static JsonAttributeParser<String> PARSER_SIGNATURE = new JsonAttributeParser<>(Record.Fields.SIGNATURE, String.class);
protected Configuration config;
protected CryptoService cryptoService;
protected ObjectMapper objectMapper;
@Override
public void afterPropertiesSet() {
super.afterPropertiesSet();
config = Configuration.instance();
cryptoService = ServiceLocator.instance().getCryptoService();
}
@Override
public void close() throws IOException {
super.close();
}
public <T extends Record> T sendRecord(Peer peer, String path, Wallet wallet, T record) {
ObjectMapper objectMapper = getObjectMapper();
fillDefaults(wallet, record);
// Add hash + signature
T signedRecord = addHashAndSignature(wallet, record);
try {
if (log.isDebugEnabled()) {
String json = objectMapper.writeValueAsString(signedRecord);
log.debug("Sending POST request to [{}]: {}", path, json);
}
HttpPost httpPost = new HttpPost(httpService.getPath(peer, path));
HttpEntity entity = EntityBuilder.create()
.setContentType(ContentType.APPLICATION_JSON)
.setBinary(objectMapper.writeValueAsBytes(signedRecord))
.build();
httpPost.setEntity(entity);
// Send it to pod
String id = this.httpService.executeRequest(httpPost, String.class);
// Save the id
signedRecord.setId(id);
return signedRecord;
} catch(JsonProcessingException e) {
throw new TechnicalException("Unable to serialize UserEvent object", e);
}
}
protected <T extends Record> T addHashAndSignature(@NonNull Wallet wallet, @NonNull T record) {
String hash = cryptoService.hash(toJson(record, true));
record.setHash(hash);
String signature = cryptoService.sign(hash, wallet.getSecKey());
record.setSignature(signature);
return record;
}
private <T extends Record> String toJson(T record, boolean cleanHashAndSignature) {
try {
String json = getObjectMapper().writeValueAsString(record);
if (cleanHashAndSignature) {
json = PARSER_SIGNATURE.removeFromJson(json);
json = PARSER_HASH.removeFromJson(json);
}
return json;
} catch(JsonProcessingException e) {
throw new TechnicalException("Unable to serialize UserEvent object", e);
}
}
protected <R extends Record> void fillDefaults(Wallet wallet, R record) {
record.setIssuer(wallet.getPubKeyHash());
// Set time
if (record.getTime() == null) {
record.setTime(System.currentTimeMillis() / 1000);
}
// Set version
if (record.getVersion() == null) {
record.setVersion(Records.PROTOCOL_VERSION);
}
}
protected ObjectMapper getObjectMapper() {
if (objectMapper == null) {
objectMapper = JacksonUtils.getThreadObjectMapper();
}
return objectMapper;
}
}
package org.duniter.elasticsearch.client.service;
/*-
* #%L
* Cesium+ pod :: Client API
* %%
* Copyright (C) 2014 - 2023 Duniter Team
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import org.duniter.core.beans.Bean;
import java.io.Closeable;
import java.io.IOException;
public class ServiceLocator extends org.duniter.core.client.service.ServiceLocator implements Closeable {
/**
* The shared instance of this ServiceLocator.
*/
private static ServiceLocator instance = new ServiceLocator();
/**
* Gets the shared instance of this Class
*
* @return the shared service locator instance.
*/
public static ServiceLocator instance() {
return instance;
}
org.duniter.core.client.service.ServiceLocator delegate;
protected ServiceLocator() {
init();
}
public void init() {
if (delegate == null) {
delegate = org.duniter.core.client.service.ServiceLocator.instance();
delegate.init();
}
}
@Override
public void close() throws IOException {
if (delegate != null)
delegate.close();
}
public UserProfileService getUserProfileService() {
return delegate.getBean(UserProfileService.class);
}
public UserSettingsService getUserSettingsService() {
return delegate.getBean(UserSettingsService.class);
}
public <S extends Bean> S getBean(Class<S> clazz) {
if (delegate == null) init();
return delegate.getBean(clazz);
}
}
package org.duniter.elasticsearch.client.service;
/*-
* #%L
* Cesium+ pod :: Client API
* %%
* Copyright (C) 2014 - 2023 Duniter Team
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import org.duniter.core.beans.Service;
import org.duniter.core.client.model.local.Peer;
import org.duniter.core.client.model.local.Wallet;
import org.duniter.elasticsearch.model.Page;
import org.duniter.elasticsearch.client.model.filter.MovementFilter;
import org.duniter.elasticsearch.client.model.filter.UserProfileFilter;
import org.duniter.elasticsearch.model.blockchain.Movement;
import org.duniter.elasticsearch.model.user.UserProfile;
import javax.annotation.Nullable;
import java.util.stream.Stream;
import org.geojson.FeatureCollection;
public interface UserProfileService extends Service {
Stream<UserProfile> findAllByFilter(Peer peer, UserProfileFilter filter, @Nullable Page page);
UserProfile save(Peer peer, Wallet wallet, UserProfile userProfile);
UserProfile update(Peer peer, Wallet wallet, UserProfile userProfile);
FeatureCollection toGeoJson(Iterable<UserProfile> profiles, String... fields);
Stream<Movement> findMovements(Peer peer, MovementFilter filter, @Nullable Page page);
boolean deleteByPubkey(Peer peer, Wallet wallet, String pubkey);
boolean delete(Peer peer, Wallet wallet, UserProfile userProfile);
}
package org.duniter.elasticsearch.client.service;
/*-
* #%L
* Cesium+ pod :: Client API
* %%
* Copyright (C) 2014 - 2023 Duniter Team
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import lombok.NonNull;
import org.duniter.core.beans.Service;
import org.duniter.core.client.model.local.Peer;
import org.duniter.core.client.model.local.Wallet;
import org.duniter.elasticsearch.model.Page;
import org.duniter.elasticsearch.client.model.filter.UserSettingsFilter;
import org.duniter.elasticsearch.model.user.UserSettings;
import javax.annotation.Nullable;
import java.util.Optional;
import java.util.stream.Stream;
public interface UserSettingsService extends Service {
Stream<UserSettings> findAllByFilter(@NonNull Peer peer,
@NonNull UserSettingsFilter filter,
@Nullable Page page);
UserSettings save(Peer peer, Wallet wallet, UserSettings settings);
Optional<UserSettings> findByPubkey(Peer peer, String pubkey);
boolean deleteByPubkey(Peer peer, Wallet wallet, String pubkey);
boolean delete(Peer peer, Wallet wallet, UserSettings settings);
}
org.duniter.core.client.service.bma.BlockchainRemoteServiceImpl
org.duniter.core.client.service.bma.NetworkRemoteServiceImpl
org.duniter.core.client.service.bma.WotRemoteServiceImpl
org.duniter.core.client.service.bma.TransactionRemoteServiceImpl
org.duniter.core.client.service.elasticsearch.CurrencyPodRemoteServiceImpl
org.duniter.core.service.Ed25519CryptoServiceImpl
org.duniter.core.client.service.HttpServiceImpl
org.duniter.core.client.service.DataContext
org.duniter.core.client.service.local.PeerServiceImpl
org.duniter.core.client.service.local.CurrencyServiceImpl
org.duniter.core.client.service.local.NetworkServiceImpl
org.duniter.core.client.repositories.mem.MemoryCurrencyRepositoryImpl
org.duniter.core.client.repositories.mem.MemoryPeerRepositoryImpl
org.duniter.elasticsearch.client.service.UserProfileServiceImpl
org.duniter.elasticsearch.client.service.UserSettingsServiceImpl
\ No newline at end of file
### ###
# Global logging configuration # Global logging configuration
log4j.rootLogger=ERROR, stdout, file log4j.rootLogger=INFO, stdout, file
# Console output # Console appender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %5p (%c:%L) - %m%n log4j.appender.stdout.layout.ConversionPattern=%p - %m%n
# ucoin levels
log4j.logger.org.duniter=DEBUG
log4j.logger.org.duniter.core.client.service.bma.AbstractNetworkService=WARN
# File appender
log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.file=ucoin-client.log log4j.appender.file.file=target/cesium-plus-pod-client.log
log4j.appender.file.MaxFileSize=10MB log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=4 log4j.appender.file.MaxBackupIndex=4
log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ISO8601} %5p %c - %m%n log4j.appender.file.layout.ConversionPattern=%d{ISO8601} %5p %c - %m%n
# Duniter4j levels
log4j.logger.org.duniter=WARN
# Cesium+ Pod levels
log4j.logger.org.duniter.elasticsearch.client=DEBUG
log4j.logger.org.duniter.cesium.pod=DEBUG
# Other frameworks levels
log4j.logger.org.apache.http=ERROR
log4j.logger.org.nuiton.util=WARN
log4j.logger.org.nuiton.config=WARN
log4j.logger.org.nuiton.converter=WARN
log4j.logger.org.nuiton.i18n=ERROR
# Http client connection debug
#log4j.logger.org.apache.http.impl.conn=DEBUG
\ No newline at end of file
#duniter4j.node.host=g1.data.e-is.pro
#duniter4j.node.port=443
#duniter4j.node.host=192.168.0.45
#duniter4j.node.port=9200
#duniter4j.node.host=data.gchange.fr
#duniter4j.node.port=443
#duniter4j.node.host=g1s.data.e-is.pro
#duniter4j.node.port=80
duniter4j.node.host=g1.data.e-is.pro
duniter4j.node.port=443
\ No newline at end of file
ovale, trois, Rat, Lamarckie, ailé, d’Europe, Macaque, Zircon, Gayane, bifascié, Iris, Hutia, Lynx, Pierrine, multiflore, Harpie, Reuel, Platanthère, Trèfle, écureuil, Cirse, Gagée, Epilobe, Anémone, Figuier, Cardinal, Heimana, aphaca, Cytise, pied-d'oiseau, Carcajou, Corydale, arc-en-ciel, chromifère, printemps, impériale, Orpin, marron, Pisaure, d'Ortie, Açores, Ginkgo, Mouron, Plectrophane, marginée, minuscule, Crocus, l'Est, Beaux, Morgan, hirsute, Phytolacca, multicolore, Orphée, Veuve, Gesse, Billard, Lamproie, Noredine, ronde, Sabline, Vannie, Rhinopithèque, feuilles, Néotine, coeur, Belle, Grande-gueule, Bignone, Vipérine, Passerage, Oeillet, Caracara, Casseille, Carotte, Sybel, Cordiérite, grosses, Drave, pervenche, Eudora, Galles, épineux, Bugrane, Papillon, Airelle, Pissenlit, marais, épi, Fourmi, européen, Bilail, Huîtrier-pie, Selvi, étoilé, faux, Ratufa, Héliolite, Béryl, tête-de-boeuf, Charançon, noire, Séneçon, oroméditerranéen, Lobelia, Pays, Violette, papillon, Nawel, Chicorée, Merle, à, Obsidienne, Nautile, linaire, Vive, Nerprun, Hibiscus, Salsifis, Kiwi, violette, Chèvrefeuille, biloba, collier, Krispin, vinaigre, Hong, printanière, sapins, Madère, Ficoïde, Cosentinia, Eglantier, Sterne, Cigale, Ylang-ylang, Johannie, Virgilier, Ondatra, alkekenge, Camélia, Angwantibo, Rhinanthe, Grenouille, Ail, Kalanchoë, Zinnia, précoce, Virginie, Margie, Abgar, Gaur, Oseille, Elberta, Manul, Muflier, Libocèdre, Séquoia, Grillon, d'Autriche, Furet, Onopordon, Longanier, Véronique, Faucon, Cornouiller, Araignée, Fuchs, larges, Bonobo, Merlebleu, malaya, Andésine, fasciée, chevelu, trilobé, Microcline, Diamant, Ringhal, opposées, Pic, Pie, tubéreuse, Pin, Mouche, Sphinx, rose, ailes, Pyrole, Barbeau, Glaïeul, semidécurente, Accenteur, Shina, alba, Sénevé, Cenis, penché, Baliste, Ambre, Listère, points, Androsace, Orchis, roux, dorée, Madrone, Scarabée, Crevette, Varan, Stellaire, Ly, d'Espagne, arborescente, Nelly, Grenat, odorante, Oeil, Tourmaline, Colibri, Ancolie, Bianka, Gouet, Frangipanier, Daphné, Kanoa, Baleine, grièche, buse, Astérolide, Brugmansia, Verdier, couchée, Japon, Écureuil, Phaner, murs, Citrine, Ruby, Demi, Herbe, Raiponce, alpestre, brillant, Argyrolobe, sarde, Carline, Napoléon, Smaragdite, Reuter, Doronic, Calcite, Iguane, Achillée, Marguerite, léopard, Linaigrette, Arbousier, Brachychiton, Caroubier, Lotier, Rhésus, Pied-de-poule, Parnassie, Mélèze, grandes, Seringat, Aurora, Gwendolina, cordées, prés, Wapiti, bois, Primevère, rameuse, Yèble, Aconit, cantabrique, Laurier, nobilis, renflé, Paronyque, Siamang, Jonquille, Arisarum, Loir, Muscari, nain, Labbe, Ara, Gambas, Logan, barbu, Pou, Coyote, Crystel, Ioanna, Pulmonaire, marine, Cétoine, grise, Mélisse, luisant, Tareja, fruits, Hippopotame, Frelon, Puma, réfléchi, Kodkod, colier, Martin, Quartz, argentée, Lin, fausse-phlomide, Lis, Marouette, Lychnis, Clorinda, d'Italie, tuberculé, Lilas, Gentiane, Céphalanthère, Misopate, Aéthionéma, Lingue, Crabe, yeux, Perruche, Tanaisie, Alchémille, Jean-le-Blanc, Goundi, Férule, lapon, Woma, ramifié, sauvage, Adonis, Requin, Baguenaudier, Kenny, Sérapias, petit-chêne, épaisses, Potentille, quatre, Carouge, maritime, crête-de-Coq, Greten, Amétrine, Andradite, aux, commune, Pacarana, Mara, Micocoulier, Couscous, Mainate, Aiguillat, Julienne, Ilhem, noires, graines, zoïsite, pain, Lavande, Larinioides, Asphodèle, Galinette, Calendula, Pensée, Capricorne, tropicale, loups, fleur, Bécasse, jardins, Harun, Sandre, Sylvestine, jaunâtre, Zanon, Mangabey, conifère, Scille, Marigane, crocus, Marilyne, élégant, petites, pacifique, Pallénis, démantoïde, Xatardie, nervosa, violet, Laitue, Nouhaïla, Lieu, Constentin, Meddy, Saltique, Alpes, typographe, Fahd, Punaise, perles, Kravat, Ouananiche, Millepertuis, Sardoine, Lysimaque, Calament, Sarriette, Thon, Agrion, Nice, plateau, Sanah, Oursin, Loup, noirâtre, Rosier, d'acanthe, Patas, boréal, Narval, Hortensia, gris, Grande, méconnu, japonais, Gobe-mouche, chat, mouchet, Catananche, Bénito, Liane, Canard, Soude, Jadéite, Calao, Prosopis, Grémil, écarlate, Nawell, Actinote, loutre, articulé, Erable, feu, souchet, Fouhad, Coronille, Janney, Scheuchzer, arbustive, cravant, volant, Nombril, judé, Saphir, Requin-baleine, d'Adonis, officinal, Crabier, rampante, rhinocéros, Pois, grecque, bouc, alpine, Carillon, montagne, Poisson-zèbre, très, Jasione, polyglotte, acinos, Matthiole, Zorille, petits, Carabe, Séguier, Dompte-venin, Rainette, Rollande, Cardère, Zygopetalum, Mauve, Butor, Barge, Cygne, montagnes, Genêt, Spinelle, Arbre, terrier, Hellébore, Cardamine, Durieu, sancta, Olivier, Orcanette, Blennie, Orobanche, Céraste, Marjolaine, sables, Goéland, teinturiers, Anophèle, Pyrénées, Hélianthème, Xéranthème, Micromeria, des, Girafe, Marwan, Tadorne, d’Hermann, siffleur, Lycium, Poisson-pilote, Physalis, Ayoub, Émeu, solstice, Corégone, Anne-Lyse, Panthère, Californie, rayée, Pétrel, Ouistiti, chêne, Jade, Titan, Ciste, Tarentule, velue, Narcisse, Bibacier, Vigne, fuligule, migratrice, Margouillat, Abricotier, Scabieuse, Pékan, Sicile, Vélar, Capret, Zabre, Plantain, Renoncule, Cinglard, Cistanche, Râle, Cicadelle, Randy, Leuzée, Raïhane, Sisymbre, pimprenelle, digitée, Luzerne, Bananier, pygmée, noueux, hybride, Queue-de-lièvre, rondes, Isabella, berbère, Phoque, de, acerifolius, Courlan, bec, Muge, Férid, Astragale, pourpre, Thym, Grémille, du, languettes, Léopard, fleurs, Congre, Bécassin, Fuligule, Coccinelle, Emmanuella, céréales, Zenobia, Vandoise, odorant, pêcheur, en, Quokka, doré, Scapolite, Suricate, Corrine, Nyssa, casarca, Darin, Mélampyre, bleue, Barba, Melvin, Molène, Amazone, Tortue, Liseron, Bec-croisé, Kolkwitzia, Nandou, Linotte, anémones, Chat-pêcheur, Chevêche, tigre, Phidippus, Ononis, comosum, blanc, Lisette, lierre, Sainfoin, une, Polygala, Quiscale, Alliaire, Grand, Smithsonite, Héron, Jehenos, laineuse, Genna, cendré, Erodium, Karianna, officinale, moissons, vert, Bruyère, Xylocope, militaire, Geoffroy, Pouillot, Jaoued, Acarien, Bartsie, opium, Andalousite, Bugle, cornes, Quetzal, Amorpha, Hypolaïs, senteur, flammé, Jeremejevite, nébuleuse, Axelane, Provence, Hyacinthe, Guifette, Panda, Rodié, Canada, lune, Succise, désert, fitis, Jaouen, Cynoglosse, Homard, sanguin, Magellan, Torreya, Ailante, Pulsatille, Aster, Chardon, Frégate, Catalogne, Rose, Rosa, Numbat, Lérotin, Géranium, Saxifrage, Bernache, Tofieldie, Turquoise, Méissa, Charlette, Colin, Lamier, Sphynx, listère, Sillimanite, Petite, faux-acanthe, la, Éland, Floréal, Calixa, Epiaire, Cytinet, Mateo, Moqueur, calice, Fushia, Circaète, sauge, hérissé, Oxalis, Lézard, vessie, radis, Crète, rubis, Diopside, labradorite, Jaseur, Monserrat, Giroflée, Moricandie, commun, Mectilde, Mygale, Heather, Scorsonère, Saul, Leblond, Asiminier, Oie, jacée, Caroline, Danaëlle, œil, Yack, Mimule, Lièvre, Pavot, Pédiculaire, Joubarbe, Tsuga, Brème, Eleuteriu, rayé, mako, Servanne, Réséda, Tricot, Euphorbe, Mandarin, mer, Filao, Tamarillo, Aristoloche, Wilson, Cormoran, Lotus, Chardonneret, familier, orange, Weta, duc, rousse, neiges, champêtre, Pietersite, Âne, Lucilie, Wollemia, palmier, Gaillet, maculé, Gamal, delta, Squille, fausse-raiponce, Nénuphar, Vesce, Bostryche, Oryane, Ophrys, Olm, Loubine, Saponaire, filiforme, pointes, Pécaris, tomenteuse, rude, Fatsia, Magot, Vrillette, Oxytropis, aethiopica, Huitre, tacheté, Courbine, Bécasseau, d'Aragon, Plumier, Pacanier, Fluorite, Criquet, bigarrée, Mimosa, Étrille, Lazuli, ramifiée, Troglodyte, bleu, jaune, cactus, Brazilianite, Yucca, nummulaire, Sauge, étroites, Ethérie, Castor, Barytine, Teanuanua, Buffle, chevronnée, Hercule, Cafard, Mélissanne, Pouilles, intermédiaire, Truite, albacore, Bilimbi, Vénus, Cisar, Panga, Goret, Bonelli, Chios, Genève, laineux, Azerolier, Evelina, Avocette, Brunelle, sylvestres, Ciboulette, Exuperi, Painite, noir, Blanchet, Calcédoine, Lisandra, Mélipone, vingt-deux, nonnette, Dendrocygne, admirable, Parisette, Bongare, blanche, Hérisson, Arum, ventre, Pygargue, Calliphoridé, Corail, Clématite, serpolet, Globulaire, Makaire, brun, Grassette, Faisan, maubèche, Maïssane, deux, rouge, Acanthe, Cléo, aggloméré, ciliée, Susan, d'Irlande, vivace, Bruant, verticillée, Cassien, grande, Aubriète, Arthuria, parasite, Tigre, Coris, Camomille, Juan, dents, Petit, vulgaire, Dorine, Mélilot, ensanglantée, penchée, Aralia, Aucuba, d'Amérique, mou, pleureur, Méconopsis, Jacaranda, Échidné, chevalier, Escargot, indica, Englebert, Danburite, Chrysanthèmes, Ortie, Soazick, Sardonyx, Hamamélis, Anguille, bouillon, Lupin, collines, argenté, Mont, Tétraodon, longues, Anthyllide, Montpellier, Doumenge, Launée, fausse, gorge, pèlerin, Notoceras, Germandrée, asiatique, Centaurée, Saule, Vipère, Orchidée, Pierre, Préhnite, Agate, persicaire, Jacobine, Odénie, Zazie, Crapaudine, Abeille, rochers, Piranga, géant, Singe, aquatique, Chat, Gypaète, Nacre, pâle, Mangoustanier, Arabette, Sureau, Mehonia, voyageuse, Patelle, Roselin, Carassin, Dactyle, Phacélie, Rubis, Opale, Euphorbe-cierge, naine, Achod, Engoulevent, Fusain, Lorrain, queue, Alejandro, Limonium, pyrope, Condors, Campanule, Chevalier, Linaire, Ouakari, laciniée, Martinet, Acajou, Putois, Perle, Atlas, Salamandre, imbriqué, Renouée, Gustav, Kapel, Wallace, Bécassine, ibérique, Poliste, Silène, Valériane, Blobfish, Lapis, Apatite, Limace, Serpent, noircissant, champs, Swertie, diable, Datolite, Oiseau, Chien, faux-aizoon, Ivor, Chaï, Menthe, calicule, Elaeagnus, Madyson, Bittor, Zantedeschia, élégante, Sureau-Sambucus, Pétauriste, cœur, tête, Pistachier, sept, Vulcain, verte, Jararaca, Jacinthe
\ No newline at end of file